UncountablePythonSDK 0.0.104__tar.gz → 0.0.109__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 (314) hide show
  1. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/.github/workflows/publish.yml +1 -1
  2. {uncountablepythonsdk-0.0.104/UncountablePythonSDK.egg-info → uncountablepythonsdk-0.0.109}/PKG-INFO +2 -2
  3. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109/UncountablePythonSDK.egg-info}/PKG-INFO +2 -2
  4. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/docs/requirements.txt +2 -2
  5. uncountablepythonsdk-0.0.109/examples/integration-server/jobs/materials_auto/example_wh.py +23 -0
  6. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/pkgs/argument_parser/argument_parser.py +52 -17
  7. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/pkgs/filesystem_utils/_gdrive_session.py +1 -1
  8. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/pkgs/serialization/annotation.py +3 -3
  9. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/pkgs/serialization/missing_sentry.py +1 -1
  10. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/pkgs/serialization/serial_alias.py +2 -2
  11. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/pkgs/serialization/serial_class.py +1 -12
  12. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/pkgs/serialization/serial_generic.py +1 -1
  13. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/pkgs/serialization/serial_union.py +3 -3
  14. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/pkgs/serialization_util/serialization_helpers.py +4 -1
  15. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/pkgs/type_spec/builder.py +4 -1
  16. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/pkgs/type_spec/config.py +5 -2
  17. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/pkgs/type_spec/cross_output_links.py +1 -1
  18. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/pkgs/type_spec/emit_open_api_util.py +3 -3
  19. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/pkgs/type_spec/emit_python.py +1 -9
  20. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/pkgs/type_spec/type_info/emit_type_info.py +1 -1
  21. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/pkgs/type_spec/util.py +5 -3
  22. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/pkgs/type_spec/value_spec/__main__.py +7 -0
  23. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/pkgs/type_spec/value_spec/emit_python.py +2 -0
  24. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/integration/job.py +6 -0
  25. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/integration/queue_runner/datastore/datastore_sqlite.py +1 -1
  26. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/types/api/entity/lookup_entity.py +2 -0
  27. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/types/api/recipes/add_time_series_data.py +0 -1
  28. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/types/api/recipes/edit_recipe_inputs.py +0 -2
  29. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/types/api/recipes/get_recipe_links.py +0 -1
  30. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/types/api/recipes/lock_recipes.py +0 -1
  31. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/types/api/recipes/set_recipe_outputs.py +0 -1
  32. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/types/api/recipes/unlock_recipes.py +0 -1
  33. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/types/client_base.py +21 -0
  34. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/types/client_config_t.py +0 -1
  35. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/types/entity_t.py +55 -21
  36. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/types/field_values.py +4 -0
  37. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/types/field_values_t.py +53 -3
  38. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/types/generic_upload_t.py +0 -1
  39. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/types/job_definition_t.py +0 -2
  40. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/types/recipe_workflow_steps_t.py +0 -1
  41. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/types/response_t.py +0 -1
  42. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/types/webhook_job.py +1 -0
  43. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/types/webhook_job_t.py +11 -0
  44. uncountablepythonsdk-0.0.104/examples/integration-server/jobs/materials_auto/example_wh.py +0 -19
  45. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/.github/workflows/documentation.yml +0 -0
  46. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/.gitignore +0 -0
  47. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/README.md +0 -0
  48. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/UncountablePythonSDK.egg-info/SOURCES.txt +0 -0
  49. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/UncountablePythonSDK.egg-info/dependency_links.txt +0 -0
  50. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/UncountablePythonSDK.egg-info/requires.txt +0 -0
  51. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/UncountablePythonSDK.egg-info/top_level.txt +0 -0
  52. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/docs/.gitignore +0 -0
  53. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/docs/conf.py +0 -0
  54. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/docs/index.md +0 -0
  55. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/docs/justfile +0 -0
  56. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/docs/quickstart.md +0 -0
  57. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/docs/static/favicons/android-chrome-192x192.png +0 -0
  58. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/docs/static/favicons/android-chrome-512x512.png +0 -0
  59. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/docs/static/favicons/apple-touch-icon.png +0 -0
  60. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/docs/static/favicons/browserconfig.xml +0 -0
  61. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/docs/static/favicons/favicon-16x16.png +0 -0
  62. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/docs/static/favicons/favicon-32x32.png +0 -0
  63. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/docs/static/favicons/manifest.json +0 -0
  64. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/docs/static/favicons/mstile-150x150.png +0 -0
  65. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/docs/static/favicons/safari-pinned-tab.svg +0 -0
  66. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/docs/static/logo_blue.png +0 -0
  67. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/examples/async_batch.py +0 -0
  68. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/examples/create_entity.py +0 -0
  69. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/examples/download_files.py +0 -0
  70. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/examples/edit_recipe_inputs.py +0 -0
  71. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/examples/integration-server/jobs/materials_auto/example_cron.py +0 -0
  72. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/examples/integration-server/jobs/materials_auto/profile.yaml +0 -0
  73. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/examples/integration-server/pyproject.toml +0 -0
  74. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/examples/invoke_uploader.py +0 -0
  75. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/examples/set_recipe_metadata_file.py +0 -0
  76. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/examples/set_recipe_output_file_sdk.py +0 -0
  77. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/examples/upload_files.py +0 -0
  78. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/pkgs/__init__.py +0 -0
  79. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/pkgs/argument_parser/__init__.py +0 -0
  80. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/pkgs/argument_parser/_is_enum.py +0 -0
  81. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/pkgs/argument_parser/_is_namedtuple.py +0 -0
  82. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/pkgs/argument_parser/case_convert.py +0 -0
  83. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/pkgs/filesystem_utils/__init__.py +0 -0
  84. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/pkgs/filesystem_utils/_blob_session.py +0 -0
  85. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/pkgs/filesystem_utils/_local_session.py +0 -0
  86. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/pkgs/filesystem_utils/_s3_session.py +0 -0
  87. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/pkgs/filesystem_utils/_sftp_session.py +0 -0
  88. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/pkgs/filesystem_utils/file_type_utils.py +0 -0
  89. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/pkgs/filesystem_utils/filesystem_session.py +0 -0
  90. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/pkgs/py.typed +0 -0
  91. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/pkgs/serialization/__init__.py +0 -0
  92. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/pkgs/serialization/opaque_key.py +0 -0
  93. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/pkgs/serialization/yaml.py +0 -0
  94. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/pkgs/serialization_util/__init__.py +0 -0
  95. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/pkgs/serialization_util/_get_type_for_serialization.py +0 -0
  96. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/pkgs/serialization_util/convert_to_snakecase.py +0 -0
  97. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/pkgs/serialization_util/dataclasses.py +0 -0
  98. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/pkgs/strenum_compat/__init__.py +0 -0
  99. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/pkgs/strenum_compat/strenum_compat.py +0 -0
  100. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/pkgs/type_spec/__init__.py +0 -0
  101. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/pkgs/type_spec/__main__.py +0 -0
  102. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/pkgs/type_spec/actions_registry/__init__.py +0 -0
  103. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/pkgs/type_spec/actions_registry/__main__.py +0 -0
  104. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/pkgs/type_spec/actions_registry/emit_typescript.py +0 -0
  105. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/pkgs/type_spec/emit_io_ts.py +0 -0
  106. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/pkgs/type_spec/emit_open_api.py +0 -0
  107. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/pkgs/type_spec/emit_typescript.py +0 -0
  108. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/pkgs/type_spec/emit_typescript_util.py +0 -0
  109. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/pkgs/type_spec/load_types.py +0 -0
  110. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/pkgs/type_spec/open_api_util.py +0 -0
  111. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/pkgs/type_spec/parts/base.py.prepart +0 -0
  112. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/pkgs/type_spec/parts/base.ts.prepart +0 -0
  113. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/pkgs/type_spec/test.py +0 -0
  114. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/pkgs/type_spec/type_info/__main__.py +0 -0
  115. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/pkgs/type_spec/value_spec/__init__.py +0 -0
  116. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/pkgs/type_spec/value_spec/convert_type.py +0 -0
  117. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/pkgs/type_spec/value_spec/types.py +0 -0
  118. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/pyproject.toml +0 -0
  119. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/setup.cfg +0 -0
  120. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/__init__.py +0 -0
  121. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/core/__init__.py +0 -0
  122. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/core/async_batch.py +0 -0
  123. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/core/client.py +0 -0
  124. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/core/environment.py +0 -0
  125. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/core/file_upload.py +0 -0
  126. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/core/types.py +0 -0
  127. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/integration/__init__.py +0 -0
  128. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/integration/cli.py +0 -0
  129. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/integration/construct_client.py +0 -0
  130. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/integration/cron.py +0 -0
  131. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/integration/db/__init__.py +0 -0
  132. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/integration/db/connect.py +0 -0
  133. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/integration/db/session.py +0 -0
  134. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/integration/entrypoint.py +0 -0
  135. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/integration/executors/__init__.py +0 -0
  136. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/integration/executors/executors.py +0 -0
  137. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/integration/executors/generic_upload_executor.py +0 -0
  138. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/integration/executors/script_executor.py +0 -0
  139. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/integration/queue_runner/__init__.py +0 -0
  140. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/integration/queue_runner/command_server/__init__.py +0 -0
  141. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/integration/queue_runner/command_server/command_client.py +0 -0
  142. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/integration/queue_runner/command_server/command_server.py +0 -0
  143. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/integration/queue_runner/command_server/protocol/__init__.py +0 -0
  144. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/integration/queue_runner/command_server/protocol/command_server.proto +0 -0
  145. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/integration/queue_runner/command_server/protocol/command_server_pb2.py +0 -0
  146. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/integration/queue_runner/command_server/protocol/command_server_pb2.pyi +0 -0
  147. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/integration/queue_runner/command_server/protocol/command_server_pb2_grpc.py +0 -0
  148. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/integration/queue_runner/command_server/types.py +0 -0
  149. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/integration/queue_runner/datastore/__init__.py +0 -0
  150. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/integration/queue_runner/datastore/interface.py +0 -0
  151. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/integration/queue_runner/datastore/model.py +0 -0
  152. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/integration/queue_runner/job_scheduler.py +0 -0
  153. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/integration/queue_runner/queue_runner.py +0 -0
  154. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/integration/queue_runner/types.py +0 -0
  155. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/integration/queue_runner/worker.py +0 -0
  156. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/integration/scan_profiles.py +0 -0
  157. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/integration/scheduler.py +0 -0
  158. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/integration/secret_retrieval/__init__.py +0 -0
  159. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/integration/secret_retrieval/retrieve_secret.py +0 -0
  160. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/integration/server.py +0 -0
  161. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/integration/telemetry.py +0 -0
  162. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/integration/webhook_server/entrypoint.py +0 -0
  163. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/py.typed +0 -0
  164. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/types/__init__.py +0 -0
  165. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/types/api/__init__.py +0 -0
  166. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/types/api/batch/__init__.py +0 -0
  167. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/types/api/batch/execute_batch.py +0 -0
  168. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/types/api/batch/execute_batch_load_async.py +0 -0
  169. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/types/api/chemical/__init__.py +0 -0
  170. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/types/api/chemical/convert_chemical_formats.py +0 -0
  171. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/types/api/entity/__init__.py +0 -0
  172. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/types/api/entity/create_entities.py +0 -0
  173. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/types/api/entity/create_entity.py +0 -0
  174. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/types/api/entity/create_or_update_entity.py +0 -0
  175. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/types/api/entity/get_entities_data.py +0 -0
  176. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/types/api/entity/grant_entity_permissions.py +0 -0
  177. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/types/api/entity/list_entities.py +0 -0
  178. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/types/api/entity/lock_entity.py +0 -0
  179. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/types/api/entity/resolve_entity_ids.py +0 -0
  180. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/types/api/entity/set_entity_field_values.py +0 -0
  181. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/types/api/entity/set_values.py +0 -0
  182. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/types/api/entity/transition_entity_phase.py +0 -0
  183. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/types/api/entity/unlock_entity.py +0 -0
  184. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/types/api/equipment/__init__.py +0 -0
  185. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/types/api/equipment/associate_equipment_input.py +0 -0
  186. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/types/api/field_options/__init__.py +0 -0
  187. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/types/api/field_options/upsert_field_options.py +0 -0
  188. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/types/api/files/__init__.py +0 -0
  189. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/types/api/files/download_file.py +0 -0
  190. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/types/api/id_source/__init__.py +0 -0
  191. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/types/api/id_source/list_id_source.py +0 -0
  192. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/types/api/id_source/match_id_source.py +0 -0
  193. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/types/api/input_groups/__init__.py +0 -0
  194. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/types/api/input_groups/get_input_group_names.py +0 -0
  195. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/types/api/inputs/__init__.py +0 -0
  196. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/types/api/inputs/create_inputs.py +0 -0
  197. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/types/api/inputs/get_input_data.py +0 -0
  198. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/types/api/inputs/get_input_names.py +0 -0
  199. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/types/api/inputs/get_inputs_data.py +0 -0
  200. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/types/api/inputs/set_input_attribute_values.py +0 -0
  201. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/types/api/inputs/set_input_category.py +0 -0
  202. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/types/api/inputs/set_input_subcategories.py +0 -0
  203. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/types/api/inputs/set_intermediate_type.py +0 -0
  204. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/types/api/material_families/__init__.py +0 -0
  205. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/types/api/material_families/update_entity_material_families.py +0 -0
  206. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/types/api/outputs/__init__.py +0 -0
  207. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/types/api/outputs/get_output_data.py +0 -0
  208. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/types/api/outputs/get_output_names.py +0 -0
  209. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/types/api/outputs/resolve_output_conditions.py +0 -0
  210. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/types/api/permissions/__init__.py +0 -0
  211. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/types/api/permissions/set_core_permissions.py +0 -0
  212. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/types/api/project/__init__.py +0 -0
  213. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/types/api/project/get_projects.py +0 -0
  214. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/types/api/project/get_projects_data.py +0 -0
  215. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/types/api/recipe_links/__init__.py +0 -0
  216. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/types/api/recipe_links/create_recipe_link.py +0 -0
  217. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/types/api/recipe_links/remove_recipe_link.py +0 -0
  218. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/types/api/recipe_metadata/__init__.py +0 -0
  219. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/types/api/recipe_metadata/get_recipe_metadata_data.py +0 -0
  220. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/types/api/recipes/__init__.py +0 -0
  221. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/types/api/recipes/add_recipe_to_project.py +0 -0
  222. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/types/api/recipes/archive_recipes.py +0 -0
  223. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/types/api/recipes/associate_recipe_as_input.py +0 -0
  224. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/types/api/recipes/associate_recipe_as_lot.py +0 -0
  225. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/types/api/recipes/clear_recipe_outputs.py +0 -0
  226. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/types/api/recipes/create_recipe.py +0 -0
  227. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/types/api/recipes/create_recipes.py +0 -0
  228. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/types/api/recipes/disassociate_recipe_as_input.py +0 -0
  229. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/types/api/recipes/get_column_calculation_values.py +0 -0
  230. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/types/api/recipes/get_curve.py +0 -0
  231. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/types/api/recipes/get_recipe_calculations.py +0 -0
  232. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/types/api/recipes/get_recipe_names.py +0 -0
  233. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/types/api/recipes/get_recipe_output_metadata.py +0 -0
  234. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/types/api/recipes/get_recipes_data.py +0 -0
  235. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/types/api/recipes/remove_recipe_from_project.py +0 -0
  236. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/types/api/recipes/set_recipe_inputs.py +0 -0
  237. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/types/api/recipes/set_recipe_metadata.py +0 -0
  238. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/types/api/recipes/set_recipe_output_annotations.py +0 -0
  239. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/types/api/recipes/set_recipe_output_file.py +0 -0
  240. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/types/api/recipes/set_recipe_tags.py +0 -0
  241. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/types/api/recipes/unarchive_recipes.py +0 -0
  242. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/types/api/triggers/__init__.py +0 -0
  243. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/types/api/triggers/run_trigger.py +0 -0
  244. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/types/api/uploader/__init__.py +0 -0
  245. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/types/api/uploader/invoke_uploader.py +0 -0
  246. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/types/async_batch.py +0 -0
  247. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/types/async_batch_processor.py +0 -0
  248. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/types/async_batch_t.py +0 -0
  249. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/types/async_jobs.py +0 -0
  250. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/types/async_jobs_t.py +0 -0
  251. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/types/auth_retrieval.py +0 -0
  252. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/types/auth_retrieval_t.py +0 -0
  253. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/types/base.py +0 -0
  254. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/types/base_t.py +0 -0
  255. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/types/calculations.py +0 -0
  256. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/types/calculations_t.py +0 -0
  257. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/types/chemical_structure.py +0 -0
  258. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/types/chemical_structure_t.py +0 -0
  259. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/types/client_config.py +0 -0
  260. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/types/curves.py +0 -0
  261. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/types/curves_t.py +0 -0
  262. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/types/entity.py +0 -0
  263. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/types/experiment_groups.py +0 -0
  264. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/types/experiment_groups_t.py +0 -0
  265. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/types/fields.py +0 -0
  266. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/types/fields_t.py +0 -0
  267. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/types/generic_upload.py +0 -0
  268. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/types/id_source.py +0 -0
  269. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/types/id_source_t.py +0 -0
  270. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/types/identifier.py +0 -0
  271. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/types/identifier_t.py +0 -0
  272. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/types/input_attributes.py +0 -0
  273. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/types/input_attributes_t.py +0 -0
  274. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/types/inputs.py +0 -0
  275. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/types/inputs_t.py +0 -0
  276. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/types/integration_server.py +0 -0
  277. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/types/integration_server_t.py +0 -0
  278. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/types/job_definition.py +0 -0
  279. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/types/outputs.py +0 -0
  280. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/types/outputs_t.py +0 -0
  281. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/types/overrides.py +0 -0
  282. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/types/overrides_t.py +0 -0
  283. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/types/permissions.py +0 -0
  284. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/types/permissions_t.py +0 -0
  285. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/types/phases.py +0 -0
  286. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/types/phases_t.py +0 -0
  287. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/types/post_base.py +0 -0
  288. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/types/post_base_t.py +0 -0
  289. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/types/queued_job.py +0 -0
  290. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/types/queued_job_t.py +0 -0
  291. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/types/recipe_identifiers.py +0 -0
  292. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/types/recipe_identifiers_t.py +0 -0
  293. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/types/recipe_inputs.py +0 -0
  294. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/types/recipe_inputs_t.py +0 -0
  295. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/types/recipe_links.py +0 -0
  296. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/types/recipe_links_t.py +0 -0
  297. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/types/recipe_metadata.py +0 -0
  298. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/types/recipe_metadata_t.py +0 -0
  299. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/types/recipe_output_metadata.py +0 -0
  300. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/types/recipe_output_metadata_t.py +0 -0
  301. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/types/recipe_tags.py +0 -0
  302. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/types/recipe_tags_t.py +0 -0
  303. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/types/recipe_workflow_steps.py +0 -0
  304. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/types/recipes.py +0 -0
  305. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/types/recipes_t.py +0 -0
  306. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/types/response.py +0 -0
  307. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/types/secret_retrieval.py +0 -0
  308. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/types/secret_retrieval_t.py +0 -0
  309. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/types/units.py +0 -0
  310. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/types/units_t.py +0 -0
  311. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/types/users.py +0 -0
  312. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/types/users_t.py +0 -0
  313. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/types/workflows.py +0 -0
  314. {uncountablepythonsdk-0.0.104 → uncountablepythonsdk-0.0.109}/uncountable/types/workflows_t.py +0 -0
@@ -56,4 +56,4 @@ jobs:
56
56
  name: package-distributions
57
57
  path: dist/
58
58
  - name: Publish package distributions to PyPI
59
- uses: pypa/gh-action-pypi-publish@fb9fc6a4e67ca27a7a76b17bbf90be83c2d3c716
59
+ uses: pypa/gh-action-pypi-publish@db8f07d3871a0a180efa06b95d467625c19d5d5f
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.2
1
+ Metadata-Version: 2.4
2
2
  Name: UncountablePythonSDK
3
- Version: 0.0.104
3
+ Version: 0.0.109
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
- Metadata-Version: 2.2
1
+ Metadata-Version: 2.4
2
2
  Name: UncountablePythonSDK
3
- Version: 0.0.104
3
+ Version: 0.0.109
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,8 +1,8 @@
1
1
  furo==2024.8.6
2
2
  myst-parser==4.0.0
3
- sphinx-autoapi==3.4.0
3
+ sphinx-autoapi==3.6.0
4
4
  sphinx-copybutton==0.5.2
5
- Sphinx==8.1.3
5
+ Sphinx==8.2.0
6
6
  sphinx_design==0.6.1
7
7
  sphinx-favicon==1.0.1
8
8
  astroid==3.3.8
@@ -0,0 +1,23 @@
1
+ from dataclasses import dataclass
2
+
3
+ from uncountable.integration.job import JobArguments, WebhookJob, register_job
4
+ from uncountable.types import job_definition_t
5
+
6
+
7
+ @dataclass(kw_only=True)
8
+ class ExampleWebhookPayload:
9
+ id: int
10
+ message: str
11
+
12
+
13
+ @register_job
14
+ class WebhookExample(WebhookJob[ExampleWebhookPayload]):
15
+ def run(
16
+ self, args: JobArguments, payload: ExampleWebhookPayload
17
+ ) -> job_definition_t.JobResult:
18
+ args.logger.log_info(f"webhook invoked with payload: {payload}")
19
+ return job_definition_t.JobResult(success=True)
20
+
21
+ @property
22
+ def webhook_payload_type(self) -> type:
23
+ return ExampleWebhookPayload
@@ -58,7 +58,9 @@ class ParserOptions:
58
58
  return self.encoding == SourceEncoding.API
59
59
 
60
60
  @property
61
- def allow_direct_dataclass(self) -> bool:
61
+ def allow_direct_type(self) -> bool:
62
+ """This allows parsing from a DB column without having to check whether it's
63
+ the native format of the type, a JSON column, or a string encoding."""
62
64
  return self.encoding == SourceEncoding.STORAGE
63
65
 
64
66
 
@@ -97,7 +99,23 @@ def is_missing(field_type: typing.Any) -> bool:
97
99
  return not (len(args) == 0 or args[0] is not MissingSentryType)
98
100
 
99
101
 
100
- def _invoke_tuple_parsers[T](
102
+ def _has_field_default(field: dataclasses.Field[typing.Any]) -> bool:
103
+ return (
104
+ field.default != dataclasses.MISSING
105
+ and not isinstance(field.default, MissingSentryType)
106
+ ) or field.default_factory != dataclasses.MISSING
107
+
108
+
109
+ def _get_field_default(
110
+ field: dataclasses.Field[typing.Any],
111
+ ) -> typing.Any:
112
+ if field.default != dataclasses.MISSING:
113
+ return field.default
114
+ assert field.default_factory != dataclasses.MISSING
115
+ return field.default_factory()
116
+
117
+
118
+ def _invoke_tuple_parsers(
101
119
  tuple_type: type[T],
102
120
  arg_parsers: typing.Sequence[typing.Callable[[typing.Any], object]],
103
121
  has_ellipsis: bool,
@@ -134,7 +152,7 @@ def _invoke_fallback_parsers(
134
152
  ) from ExceptionGroup("Fallback Parser Exception", exceptions)
135
153
 
136
154
 
137
- def _invoke_membership_parser[T](
155
+ def _invoke_membership_parser(
138
156
  expected_values: set[T],
139
157
  value: typing.Any,
140
158
  ) -> T:
@@ -149,13 +167,13 @@ def _invoke_membership_parser[T](
149
167
  raise ValueError(f"Expected value from {expected_values} but got value {value}")
150
168
 
151
169
 
152
- def _build_parser_discriminated_union[T](
170
+ def _build_parser_discriminated_union(
153
171
  context: ParserContext,
154
172
  discriminator: str,
155
173
  discriminator_map: dict[str, ParserFunction[T]],
156
174
  ) -> ParserFunction[T]:
157
175
  def parse(value: typing.Any) -> typing.Any:
158
- if context.options.allow_direct_dataclass and dataclasses.is_dataclass(value):
176
+ if context.options.allow_direct_type and dataclasses.is_dataclass(value):
159
177
  discriminant = getattr(value, discriminator)
160
178
  else:
161
179
  discriminant = value.get(discriminator)
@@ -171,7 +189,7 @@ def _build_parser_discriminated_union[T](
171
189
  return parse
172
190
 
173
191
 
174
- def _build_parser_inner[T](
192
+ def _build_parser_inner(
175
193
  parsed_type: type[T],
176
194
  context: ParserContext,
177
195
  ) -> ParserFunction[T]:
@@ -318,10 +336,22 @@ def _build_parser_inner[T](
318
336
  return parse_int
319
337
 
320
338
  if parsed_type is datetime:
321
- return lambda value: dateutil.parser.isoparse(value) # type:ignore
339
+
340
+ def parse_datetime(value: typing.Any) -> T:
341
+ if context.options.allow_direct_type and isinstance(value, datetime):
342
+ return value # type: ignore
343
+ return dateutil.parser.isoparse(value) # type:ignore
344
+
345
+ return parse_datetime
322
346
 
323
347
  if parsed_type is date:
324
- return lambda value: date.fromisoformat(value) # type:ignore
348
+
349
+ def parse_date(value: typing.Any) -> T:
350
+ if context.options.allow_direct_type and isinstance(value, date):
351
+ return value # type:ignore
352
+ return date.fromisoformat(value) # type:ignore
353
+
354
+ return parse_date
325
355
 
326
356
  # MyPy: It's unclear why `parsed_type in (str, OpaqueKey)` is flagged as invalid
327
357
  # Thus an or statement is used instead, which isn't flagged as invalid.
@@ -369,7 +399,7 @@ def _build_parser_inner[T](
369
399
  raise ValueError(f"Unhandled type {parsed_type}/{origin}")
370
400
 
371
401
 
372
- def _build_parser_dataclass[T](
402
+ def _build_parser_dataclass(
373
403
  parsed_type: type[T],
374
404
  context: ParserContext,
375
405
  ) -> ParserFunction[T]:
@@ -405,7 +435,7 @@ def _build_parser_dataclass[T](
405
435
 
406
436
  def parse(value: typing.Any) -> typing.Any:
407
437
  # Use an exact type match to prevent base/derived class mismatches
408
- if context.options.allow_direct_dataclass and type(value) is parsed_type:
438
+ if context.options.allow_direct_type and type(value) is parsed_type:
409
439
  return value
410
440
 
411
441
  data: dict[typing.Any, typing.Any] = {}
@@ -420,10 +450,8 @@ def _build_parser_dataclass[T](
420
450
  if field_raw_value == dataclasses.MISSING:
421
451
  if serial_class_data.has_parse_require(field.name):
422
452
  raise ValueError("missing-required-field", field.name)
423
- if field.default != dataclasses.MISSING:
424
- field_value = field.default
425
- elif field.default_factory != dataclasses.MISSING:
426
- field_value = field.default_factory()
453
+ if _has_field_default(field):
454
+ field_value = _get_field_default(field)
427
455
  elif is_missing(field_type):
428
456
  field_value = MissingSentryType()
429
457
  elif is_optional(field_type):
@@ -435,6 +463,13 @@ def _build_parser_dataclass[T](
435
463
  field_value = False
436
464
  else:
437
465
  raise ValueError("missing-value-for-field", field.name)
466
+ elif (
467
+ field_raw_value is None
468
+ and not is_optional(field_type)
469
+ and _has_field_default(field)
470
+ and not serial_class_data.has_parse_require(field.name)
471
+ ):
472
+ field_value = _get_field_default(field)
438
473
  elif serial_class_data.has_unconverted_value(field.name):
439
474
  field_value = field_raw_value
440
475
  else:
@@ -480,7 +515,7 @@ def _build_parser_dataclass[T](
480
515
  _CACHE_MAP: dict[ParserOptions, ParserCache] = defaultdict(ParserCache)
481
516
 
482
517
 
483
- def build_parser[T](
518
+ def build_parser(
484
519
  parsed_type: type[T],
485
520
  options: ParserOptions,
486
521
  ) -> ParserFunction[T]:
@@ -502,7 +537,7 @@ def build_parser[T](
502
537
  return built_parser
503
538
 
504
539
 
505
- class ParserBase[T](ABC):
540
+ class ParserBase(ABC, typing.Generic[T]):
506
541
  def parse_from_encoding(
507
542
  self,
508
543
  args: typing.Any,
@@ -533,7 +568,7 @@ class ParserBase[T](ABC):
533
568
  return self.parse_storage(yaml.safe_load(fp))
534
569
 
535
570
 
536
- class CachedParser[T](ParserBase[T]):
571
+ class CachedParser(ParserBase[T], typing.Generic[T]):
537
572
  def __init__(
538
573
  self,
539
574
  args: type[T],
@@ -63,7 +63,7 @@ def download_gdrive_file(
63
63
  downloader = MediaIoBaseDownload(file_handler, file_request)
64
64
  download_complete = False
65
65
  while not download_complete:
66
- status, download_complete = downloader.next_chunk()
66
+ _status, download_complete = downloader.next_chunk()
67
67
 
68
68
  file_handler.seek(0)
69
69
  file_data = file_handler.read()
@@ -16,7 +16,7 @@ class SerialBase:
16
16
  from_decorator: bool = False
17
17
 
18
18
 
19
- def get_serial_annotation[T](parsed_type: type[T]) -> SerialBase | None:
19
+ def get_serial_annotation(parsed_type: type[T]) -> SerialBase | None:
20
20
  if not hasattr(parsed_type, "__metadata__"):
21
21
  return None
22
22
  metadata = parsed_type.__metadata__ # type:ignore[attr-defined]
@@ -28,7 +28,7 @@ def get_serial_annotation[T](parsed_type: type[T]) -> SerialBase | None:
28
28
  return serial
29
29
 
30
30
 
31
- class SerialInspector[T]:
31
+ class SerialInspector(typing.Generic[T]):
32
32
  def __init__(self, parsed_type: type[T], serial_base: SerialBase) -> None:
33
33
  self._parsed_type = parsed_type
34
34
  self._serial_base = serial_base
@@ -53,7 +53,7 @@ class SerialInspector[T]:
53
53
  return self._serial_base.is_dynamic_allowed
54
54
 
55
55
 
56
- def unwrap_annotated[T](parsed_type: type[T]) -> type[T]:
56
+ def unwrap_annotated(parsed_type: type[T]) -> type[T]:
57
57
  """
58
58
  If the type is an annotated type then return the origin of it.
59
59
  Otherwise return the original type.
@@ -26,5 +26,5 @@ MISSING_SENTRY = MissingSentryType()
26
26
  MissingType = Union[MissingSentryType, ClassT]
27
27
 
28
28
 
29
- def coalesce_missing_sentry[ClassT](value: MissingType[ClassT]) -> ClassT | None:
29
+ def coalesce_missing_sentry(value: MissingType[ClassT]) -> ClassT | None:
30
30
  return None if isinstance(value, MissingSentryType) else value
@@ -26,7 +26,7 @@ def serial_alias_annotation(
26
26
  )
27
27
 
28
28
 
29
- def _get_serial_alias[T](parsed_type: type[T]) -> _SerialAlias | None:
29
+ def _get_serial_alias(parsed_type: type[T]) -> _SerialAlias | None:
30
30
  serial = get_serial_annotation(parsed_type)
31
31
  if not isinstance(serial, _SerialAlias):
32
32
  return None
@@ -39,7 +39,7 @@ class SerialAliasInspector(SerialInspector[T]):
39
39
  self._serial_alias = serial_alias
40
40
 
41
41
 
42
- def get_serial_alias_data[T](parsed_type: type[T]) -> SerialAliasInspector[T] | None:
42
+ def get_serial_alias_data(parsed_type: type[T]) -> SerialAliasInspector[T] | None:
43
43
  serial = _get_serial_alias(parsed_type)
44
44
  if serial is None:
45
45
  return None
@@ -17,7 +17,6 @@ class _SerialClassData(SerialBase):
17
17
  to_string_values: set[str] = dataclasses.field(default_factory=set)
18
18
  parse_require: set[str] = dataclasses.field(default_factory=set)
19
19
  named_type_path: str | None = None
20
- explicit_defaults: set[str] = dataclasses.field(default_factory=set)
21
20
 
22
21
 
23
22
  EMPTY_SERIAL_CLASS_DATA = _SerialClassData()
@@ -31,7 +30,6 @@ def serial_class(
31
30
  parse_require: set[str] | None = None,
32
31
  named_type_path: str | None = None,
33
32
  is_dynamic_allowed: bool = False,
34
- explicit_defaults: set[str] | None = None,
35
33
  ) -> Callable[[ClassT], ClassT]:
36
34
  """
37
35
  An additional decorator to a dataclass that specifies serialization options.
@@ -54,9 +52,6 @@ def serial_class(
54
52
  requiring them for the API input.
55
53
  @param named_type_path
56
54
  The type_spec type-path to this type. This applies only to named types.
57
- @param explicit_defaults
58
- Fields that have explicit defaults in the definition. This is useful for
59
- falling back onto these defaults when the field is mandatory but receives a null value.
60
55
  """
61
56
 
62
57
  def decorate(orig_class: ClassT) -> ClassT:
@@ -68,7 +63,6 @@ def serial_class(
68
63
  named_type_path=named_type_path,
69
64
  from_decorator=True,
70
65
  is_dynamic_allowed=is_dynamic_allowed,
71
- explicit_defaults=explicit_defaults or set(),
72
66
  )
73
67
  return orig_class
74
68
 
@@ -96,9 +90,6 @@ class SerialClassDataInspector(SerialInspector[ClassT]):
96
90
  def has_parse_require(self, key: str) -> bool:
97
91
  return key in self.current.parse_require
98
92
 
99
- def has_explicit_default(self, key: str) -> bool:
100
- return key in self.current.explicit_defaults
101
-
102
93
 
103
94
  def get_merged_serial_class_data(type_class: type[Any]) -> _SerialClassData | None:
104
95
  base_class_data = (
@@ -124,13 +115,11 @@ def get_merged_serial_class_data(type_class: type[Any]) -> _SerialClassData | No
124
115
  | curr_base_class_data.to_string_values,
125
116
  parse_require=base_class_data.parse_require
126
117
  | curr_base_class_data.parse_require,
127
- explicit_defaults=base_class_data.explicit_defaults
128
- | curr_base_class_data.explicit_defaults,
129
118
  )
130
119
  return base_class_data
131
120
 
132
121
 
133
- def get_serial_class_data[ClassT](
122
+ def get_serial_class_data(
134
123
  type_class: type[ClassT],
135
124
  ) -> SerialClassDataInspector[ClassT]:
136
125
  return SerialClassDataInspector(
@@ -6,7 +6,7 @@ from .serial_class import get_merged_serial_class_data
6
6
  T = typing.TypeVar("T")
7
7
 
8
8
 
9
- def get_serial_data[T](parsed_type: type[T]) -> SerialInspector[T] | None:
9
+ def get_serial_data(parsed_type: type[T]) -> SerialInspector[T] | None:
10
10
  serial = get_serial_annotation(parsed_type)
11
11
  if serial is None:
12
12
  serial = get_merged_serial_class_data(parsed_type)
@@ -6,7 +6,7 @@ from .annotation import SerialBase, SerialInspector, get_serial_annotation
6
6
  T = typing.TypeVar("T")
7
7
 
8
8
 
9
- class IdentityHashWrapper[T]:
9
+ class IdentityHashWrapper(typing.Generic[T]):
10
10
  """This allows unhashable types to be used in the SerialUnion, like dict.
11
11
  Since we have only one copy of the types themselves, we rely on
12
12
  object identity for the hashing."""
@@ -49,7 +49,7 @@ def serial_union_annotation(
49
49
  )
50
50
 
51
51
 
52
- def _get_serial_union[T](parsed_type: type[T]) -> _SerialUnion | None:
52
+ def _get_serial_union(parsed_type: type[T]) -> _SerialUnion | None:
53
53
  serial = get_serial_annotation(parsed_type)
54
54
  if not isinstance(serial, _SerialUnion):
55
55
  return None
@@ -76,7 +76,7 @@ class SerialClassInspector(SerialInspector[T]):
76
76
  return self._serial_union.discriminator_map.inner
77
77
 
78
78
 
79
- def get_serial_union_data[T](parsed_type: type[T]) -> SerialClassInspector[T] | None:
79
+ def get_serial_union_data(parsed_type: type[T]) -> SerialClassInspector[T] | None:
80
80
  serial = _get_serial_union(parsed_type)
81
81
  if serial is None:
82
82
  return None
@@ -12,6 +12,7 @@ from typing import (
12
12
  Any,
13
13
  ClassVar,
14
14
  Protocol,
15
+ TypeVar,
15
16
  Union,
16
17
  overload,
17
18
  )
@@ -33,12 +34,14 @@ if TYPE_CHECKING:
33
34
  else:
34
35
  JsonValue = Union[JsonScalar, dict[str, Any], list[Any]]
35
36
 
37
+ T = TypeVar("T")
38
+
36
39
 
37
40
  class Dataclass(Protocol):
38
41
  __dataclass_fields__: ClassVar[dict] # type: ignore[type-arg,unused-ignore]
39
42
 
40
43
 
41
- def identity[T](x: T) -> T:
44
+ def identity(x: T) -> T:
42
45
  return x
43
46
 
44
47
 
@@ -398,7 +398,10 @@ class SpecTypeDefn(SpecType):
398
398
  has_default = True
399
399
  # IMPROVE: check the type against the ptype
400
400
  default = default_spec
401
-
401
+ if extant == PropertyExtant.missing and explicit_default:
402
+ raise Exception(
403
+ f"cannot have extant missing and default for property {name}"
404
+ )
402
405
  parse_require = False
403
406
  literal = unwrap_literal_type(ptype)
404
407
  if literal is not None:
@@ -1,7 +1,7 @@
1
1
  import os
2
2
  from collections.abc import Callable, Mapping
3
3
  from dataclasses import dataclass
4
- from typing import Self
4
+ from typing import Self, TypeVar
5
5
 
6
6
  from pkgs.serialization import yaml
7
7
 
@@ -107,7 +107,10 @@ class Config:
107
107
  open_api: OpenAPIConfig | None
108
108
 
109
109
 
110
- def _parse_language[T](config_class: type[T], raw_value: ConfigValueType) -> T:
110
+ T = TypeVar("T")
111
+
112
+
113
+ def _parse_language(config_class: type[T], raw_value: ConfigValueType) -> T:
111
114
  assert isinstance(raw_value, dict), "expecting language config to have key/values."
112
115
  return config_class(**raw_value)
113
116
 
@@ -11,7 +11,7 @@ def get_python_stub_file_path(
11
11
  ) -> str | None:
12
12
  if function_name is None:
13
13
  return None
14
- module_dir, file_name, func_name = function_name.rsplit(".", 2)
14
+ module_dir, file_name, _func_name = function_name.rsplit(".", 2)
15
15
  module_path = os.path.relpath(module_dir.replace(".", "/"))
16
16
  api_stub_file = f"{module_path}/{file_name}.py"
17
17
  return api_stub_file
@@ -14,9 +14,9 @@ from .open_api_util import OpenAPIType
14
14
 
15
15
  MODIFY_NOTICE = "# DO NOT MODIFY -- This file is generated by type_spec"
16
16
 
17
- type GlobalContextInfo = dict[str, str | dict[str, str]]
18
- type TagGroupToNamedTags = dict[str, str | list[str]]
19
- type TagPathsToRef = dict[str, dict[str, str]]
17
+ GlobalContextInfo = dict[str, str | dict[str, str]]
18
+ TagGroupToNamedTags = dict[str, str | list[str]]
19
+ TagPathsToRef = dict[str, dict[str, str]]
20
20
 
21
21
 
22
22
  @dataclass
@@ -697,7 +697,6 @@ class EmittedPropertiesMetadata:
697
697
  unconverted_values: set[str]
698
698
  to_string_values: set[str]
699
699
  parse_require: set[str]
700
- explicit_defaults: set[str]
701
700
 
702
701
 
703
702
  def _emit_type_properties(
@@ -729,7 +728,6 @@ def _emit_properties(
729
728
  unconverted_values: set[str] = set()
730
729
  to_string_values: set[str] = set()
731
730
  parse_require: set[str] = set()
732
- explicit_defaults: set[str] = set()
733
731
 
734
732
  if len(properties) > 0:
735
733
 
@@ -750,9 +748,6 @@ def _emit_properties(
750
748
  if prop.parse_require:
751
749
  parse_require.add(py_name)
752
750
 
753
- if prop.explicit_default:
754
- explicit_defaults.add(py_name)
755
-
756
751
  ref_type = refer_to(ctx, stype)
757
752
  default = None
758
753
  if prop.extant == builder.PropertyExtant.missing:
@@ -796,7 +791,6 @@ def _emit_properties(
796
791
  unconverted_values=unconverted_values,
797
792
  to_string_values=to_string_values,
798
793
  parse_require=parse_require,
799
- explicit_defaults=explicit_defaults,
800
794
  )
801
795
 
802
796
 
@@ -887,7 +881,6 @@ def _emit_type(ctx: Context, stype: builder.SpecType) -> None:
887
881
  unconverted_values = emitted_properties_metadata.unconverted_values
888
882
  to_string_values = emitted_properties_metadata.to_string_values
889
883
  parse_require = emitted_properties_metadata.parse_require
890
- explicit_defaults = emitted_properties_metadata.explicit_defaults
891
884
 
892
885
  _emit_generics(ctx, generics)
893
886
 
@@ -909,7 +902,6 @@ def _emit_type(ctx: Context, stype: builder.SpecType) -> None:
909
902
  write_values("unconverted_values", unconverted_values)
910
903
  write_values("to_string_values", to_string_values)
911
904
  write_values("parse_require", parse_require)
912
- write_values("explicit_defaults", explicit_defaults)
913
905
 
914
906
  ctx.out.write(")\n")
915
907
 
@@ -1192,7 +1184,7 @@ def _emit_api_stubs(*, builder: builder.SpecBuilder, config: PythonConfig) -> No
1192
1184
  if endpoint_function is None:
1193
1185
  continue
1194
1186
 
1195
- module_dir, file_name, func_name = endpoint_function.rsplit(".", 2)
1187
+ module_dir, file_name, _func_name = endpoint_function.rsplit(".", 2)
1196
1188
  module_path = os.path.abspath(module_dir.replace(".", "/"))
1197
1189
  api_stub_file = f"{module_path}/{file_name}.py"
1198
1190
  if os.path.isfile(api_stub_file):
@@ -163,7 +163,7 @@ class MapStringEnum(MapTypeBase):
163
163
  values: dict[str, str]
164
164
 
165
165
 
166
- type MapType = MapTypeObject | MapTypeAlias | MapStringEnum
166
+ MapType = MapTypeObject | MapTypeAlias | MapStringEnum
167
167
 
168
168
 
169
169
  @dataclasses.dataclass
@@ -1,10 +1,12 @@
1
1
  import json
2
2
  import os
3
3
  from dataclasses import dataclass
4
- from typing import Union
4
+ from typing import TypeVar, Union
5
5
 
6
6
  import regex as re
7
7
 
8
+ T = TypeVar("T")
9
+
8
10
 
9
11
  def rewrite_file(filename: str, content: str) -> bool:
10
12
  os.makedirs(os.path.dirname(filename), exist_ok=True)
@@ -154,7 +156,7 @@ def is_valid_property_name(name: str) -> bool:
154
156
  return re_pattern_property_name.match(name) is not None
155
157
 
156
158
 
157
- def check_fields[T](data: dict[str, T], allowed: list[str]) -> None:
159
+ def check_fields(data: dict[str, T], allowed: list[str]) -> None:
158
160
  for key in data:
159
161
  if key not in allowed:
160
162
  raise Exception(f"unexpected-field: {key}. Allowed: {allowed}")
@@ -178,7 +180,7 @@ def encode_common_string(value: str) -> str:
178
180
  return rep
179
181
 
180
182
 
181
- def unused[T](_arg: T) -> None:
183
+ def unused(_arg: T) -> None:
182
184
  """
183
185
  Identifies that an argument is intended not be used, as opposed to
184
186
  simply forgotten, or a remnant. This can happen in patterned calls
@@ -155,6 +155,7 @@ key_return = "return"
155
155
  key_description = "description"
156
156
  key_brief = "brief"
157
157
  key_name = "name"
158
+ key_draft = "draft"
158
159
 
159
160
 
160
161
  TypeT = TypeVar("TypeT")
@@ -229,6 +230,11 @@ def main() -> None:
229
230
 
230
231
  brief = get_as(spec, key_brief, str)
231
232
  description = get_as(spec, key_description, str)
233
+ draft = (
234
+ get_as(spec, key_draft, bool)
235
+ if spec.get(key_draft) is not None
236
+ else None
237
+ )
232
238
 
233
239
  return_value = get(spec, key_return)
234
240
  where.append("return")
@@ -245,6 +251,7 @@ def main() -> None:
245
251
  type=convert_to_value_spec_type(parsed.return_type_path),
246
252
  description=return_description,
247
253
  ),
254
+ draft=draft,
248
255
  )
249
256
  )
250
257
  where.pop()
@@ -164,6 +164,8 @@ def _emit_function(function: value_spec_t.Function, indent: str) -> str:
164
164
  f"{sub_indent}description={encode_common_string(function.description)},\n"
165
165
  )
166
166
  out.write(f"{sub_indent}brief={encode_common_string(function.brief)},\n")
167
+ if function.draft:
168
+ out.write(f"{sub_indent}draft={function.draft},\n")
167
169
  out.write(
168
170
  f"{sub_indent}return_value={_emit_function_return(function.return_value, sub_indent)},\n"
169
171
  )
@@ -85,3 +85,9 @@ class WebhookJob[WPT](Job[webhook_job_t.WebhookEventPayload]):
85
85
  def register_job(cls: type[Job]) -> type[Job]:
86
86
  cls._unc_job_registered = True
87
87
  return cls
88
+
89
+
90
+ class RunsheetWebhookJob(WebhookJob[webhook_job_t.RunsheetWebhookPayload]):
91
+ @property
92
+ def webhook_payload_type(self) -> type:
93
+ return webhook_job_t.RunsheetWebhookPayload
@@ -56,7 +56,7 @@ class DatastoreSqlite(Datastore):
56
56
  )
57
57
  session.execute(update_stmt)
58
58
  session.flush()
59
- # IMPROVE: python3.12's sqlite does not support the RETURNING clause
59
+ # IMPROVE: python3's sqlite does not support the RETURNING clause
60
60
  select_stmt = select(QueuedJob.num_attempts).filter(
61
61
  QueuedJob.id == queued_job_uuid
62
62
  )
@@ -13,6 +13,7 @@ from pkgs.serialization import serial_union_annotation
13
13
  from ... import async_batch_t
14
14
  from ... import base_t
15
15
  from ... import entity_t
16
+ from ... import field_values_t
16
17
  from ... import identifier_t
17
18
 
18
19
  __all__: list[str] = [
@@ -54,6 +55,7 @@ class LookupEntityQueryBase:
54
55
  class LookupFieldArgumentValue:
55
56
  field_key: identifier_t.IdentifierKey
56
57
  field_value: base_t.JsonValue
58
+ value_resolution: field_values_t.ValueResolution = field_values_t.ValueResolution.DIRECT
57
59
 
58
60
 
59
61
  # DO NOT MODIFY -- This file is generated by type_spec
@@ -45,7 +45,6 @@ class TimeSeriesDatum:
45
45
  # DO NOT MODIFY -- This file is generated by type_spec
46
46
  @serial_class(
47
47
  named_type_path="sdk.api.recipes.add_time_series_data.Arguments",
48
- explicit_defaults={"on_conflict"},
49
48
  )
50
49
  @dataclasses.dataclass(kw_only=True)
51
50
  class Arguments: