UncountablePythonSDK 0.0.103__tar.gz → 0.0.105__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.103 → uncountablepythonsdk-0.0.105}/.github/workflows/documentation.yml +3 -1
  2. {uncountablepythonsdk-0.0.103/UncountablePythonSDK.egg-info → uncountablepythonsdk-0.0.105}/PKG-INFO +1 -1
  3. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105/UncountablePythonSDK.egg-info}/PKG-INFO +1 -1
  4. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/docs/requirements.txt +1 -1
  5. uncountablepythonsdk-0.0.105/examples/integration-server/jobs/materials_auto/example_wh.py +23 -0
  6. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/pkgs/argument_parser/argument_parser.py +44 -9
  7. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/pkgs/serialization/serial_class.py +11 -0
  8. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/pkgs/type_spec/builder.py +7 -1
  9. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/pkgs/type_spec/emit_python.py +8 -0
  10. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/pkgs/type_spec/value_spec/__main__.py +7 -0
  11. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/pkgs/type_spec/value_spec/emit_python.py +2 -0
  12. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/integration/job.py +6 -0
  13. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/types/api/entity/lookup_entity.py +3 -0
  14. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/types/api/recipes/add_time_series_data.py +1 -0
  15. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/types/api/recipes/edit_recipe_inputs.py +2 -0
  16. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/types/api/recipes/get_recipe_links.py +1 -0
  17. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/types/api/recipes/lock_recipes.py +1 -0
  18. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/types/api/recipes/set_recipe_outputs.py +1 -0
  19. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/types/api/recipes/unlock_recipes.py +1 -0
  20. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/types/client_base.py +21 -0
  21. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/types/client_config_t.py +1 -0
  22. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/types/entity_t.py +53 -19
  23. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/types/field_values.py +2 -0
  24. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/types/field_values_t.py +28 -1
  25. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/types/generic_upload_t.py +1 -0
  26. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/types/job_definition_t.py +2 -0
  27. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/types/recipe_workflow_steps_t.py +1 -0
  28. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/types/response_t.py +1 -0
  29. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/types/webhook_job.py +1 -0
  30. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/types/webhook_job_t.py +11 -0
  31. uncountablepythonsdk-0.0.103/examples/integration-server/jobs/materials_auto/example_wh.py +0 -15
  32. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/.github/workflows/publish.yml +0 -0
  33. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/.gitignore +0 -0
  34. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/README.md +0 -0
  35. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/UncountablePythonSDK.egg-info/SOURCES.txt +0 -0
  36. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/UncountablePythonSDK.egg-info/dependency_links.txt +0 -0
  37. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/UncountablePythonSDK.egg-info/requires.txt +0 -0
  38. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/UncountablePythonSDK.egg-info/top_level.txt +0 -0
  39. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/docs/.gitignore +0 -0
  40. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/docs/conf.py +0 -0
  41. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/docs/index.md +0 -0
  42. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/docs/justfile +0 -0
  43. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/docs/quickstart.md +0 -0
  44. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/docs/static/favicons/android-chrome-192x192.png +0 -0
  45. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/docs/static/favicons/android-chrome-512x512.png +0 -0
  46. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/docs/static/favicons/apple-touch-icon.png +0 -0
  47. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/docs/static/favicons/browserconfig.xml +0 -0
  48. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/docs/static/favicons/favicon-16x16.png +0 -0
  49. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/docs/static/favicons/favicon-32x32.png +0 -0
  50. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/docs/static/favicons/manifest.json +0 -0
  51. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/docs/static/favicons/mstile-150x150.png +0 -0
  52. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/docs/static/favicons/safari-pinned-tab.svg +0 -0
  53. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/docs/static/logo_blue.png +0 -0
  54. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/examples/async_batch.py +0 -0
  55. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/examples/create_entity.py +0 -0
  56. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/examples/download_files.py +0 -0
  57. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/examples/edit_recipe_inputs.py +0 -0
  58. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/examples/integration-server/jobs/materials_auto/example_cron.py +0 -0
  59. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/examples/integration-server/jobs/materials_auto/profile.yaml +0 -0
  60. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/examples/integration-server/pyproject.toml +0 -0
  61. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/examples/invoke_uploader.py +0 -0
  62. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/examples/set_recipe_metadata_file.py +0 -0
  63. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/examples/set_recipe_output_file_sdk.py +0 -0
  64. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/examples/upload_files.py +0 -0
  65. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/pkgs/__init__.py +0 -0
  66. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/pkgs/argument_parser/__init__.py +0 -0
  67. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/pkgs/argument_parser/_is_enum.py +0 -0
  68. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/pkgs/argument_parser/_is_namedtuple.py +0 -0
  69. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/pkgs/argument_parser/case_convert.py +0 -0
  70. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/pkgs/filesystem_utils/__init__.py +0 -0
  71. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/pkgs/filesystem_utils/_blob_session.py +0 -0
  72. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/pkgs/filesystem_utils/_gdrive_session.py +0 -0
  73. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/pkgs/filesystem_utils/_local_session.py +0 -0
  74. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/pkgs/filesystem_utils/_s3_session.py +0 -0
  75. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/pkgs/filesystem_utils/_sftp_session.py +0 -0
  76. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/pkgs/filesystem_utils/file_type_utils.py +0 -0
  77. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/pkgs/filesystem_utils/filesystem_session.py +0 -0
  78. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/pkgs/py.typed +0 -0
  79. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/pkgs/serialization/__init__.py +0 -0
  80. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/pkgs/serialization/annotation.py +0 -0
  81. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/pkgs/serialization/missing_sentry.py +0 -0
  82. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/pkgs/serialization/opaque_key.py +0 -0
  83. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/pkgs/serialization/serial_alias.py +0 -0
  84. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/pkgs/serialization/serial_generic.py +0 -0
  85. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/pkgs/serialization/serial_union.py +0 -0
  86. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/pkgs/serialization/yaml.py +0 -0
  87. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/pkgs/serialization_util/__init__.py +0 -0
  88. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/pkgs/serialization_util/_get_type_for_serialization.py +0 -0
  89. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/pkgs/serialization_util/convert_to_snakecase.py +0 -0
  90. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/pkgs/serialization_util/dataclasses.py +0 -0
  91. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/pkgs/serialization_util/serialization_helpers.py +0 -0
  92. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/pkgs/strenum_compat/__init__.py +0 -0
  93. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/pkgs/strenum_compat/strenum_compat.py +0 -0
  94. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/pkgs/type_spec/__init__.py +0 -0
  95. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/pkgs/type_spec/__main__.py +0 -0
  96. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/pkgs/type_spec/actions_registry/__init__.py +0 -0
  97. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/pkgs/type_spec/actions_registry/__main__.py +0 -0
  98. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/pkgs/type_spec/actions_registry/emit_typescript.py +0 -0
  99. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/pkgs/type_spec/config.py +0 -0
  100. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/pkgs/type_spec/cross_output_links.py +0 -0
  101. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/pkgs/type_spec/emit_io_ts.py +0 -0
  102. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/pkgs/type_spec/emit_open_api.py +0 -0
  103. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/pkgs/type_spec/emit_open_api_util.py +0 -0
  104. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/pkgs/type_spec/emit_typescript.py +0 -0
  105. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/pkgs/type_spec/emit_typescript_util.py +0 -0
  106. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/pkgs/type_spec/load_types.py +0 -0
  107. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/pkgs/type_spec/open_api_util.py +0 -0
  108. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/pkgs/type_spec/parts/base.py.prepart +0 -0
  109. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/pkgs/type_spec/parts/base.ts.prepart +0 -0
  110. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/pkgs/type_spec/test.py +0 -0
  111. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/pkgs/type_spec/type_info/__main__.py +0 -0
  112. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/pkgs/type_spec/type_info/emit_type_info.py +0 -0
  113. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/pkgs/type_spec/util.py +0 -0
  114. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/pkgs/type_spec/value_spec/__init__.py +0 -0
  115. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/pkgs/type_spec/value_spec/convert_type.py +0 -0
  116. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/pkgs/type_spec/value_spec/types.py +0 -0
  117. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/pyproject.toml +0 -0
  118. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/setup.cfg +0 -0
  119. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/__init__.py +0 -0
  120. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/core/__init__.py +0 -0
  121. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/core/async_batch.py +0 -0
  122. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/core/client.py +0 -0
  123. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/core/environment.py +0 -0
  124. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/core/file_upload.py +0 -0
  125. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/core/types.py +0 -0
  126. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/integration/__init__.py +0 -0
  127. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/integration/cli.py +0 -0
  128. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/integration/construct_client.py +0 -0
  129. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/integration/cron.py +0 -0
  130. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/integration/db/__init__.py +0 -0
  131. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/integration/db/connect.py +0 -0
  132. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/integration/db/session.py +0 -0
  133. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/integration/entrypoint.py +0 -0
  134. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/integration/executors/__init__.py +0 -0
  135. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/integration/executors/executors.py +0 -0
  136. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/integration/executors/generic_upload_executor.py +0 -0
  137. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/integration/executors/script_executor.py +0 -0
  138. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/integration/queue_runner/__init__.py +0 -0
  139. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/integration/queue_runner/command_server/__init__.py +0 -0
  140. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/integration/queue_runner/command_server/command_client.py +0 -0
  141. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/integration/queue_runner/command_server/command_server.py +0 -0
  142. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/integration/queue_runner/command_server/protocol/__init__.py +0 -0
  143. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/integration/queue_runner/command_server/protocol/command_server.proto +0 -0
  144. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/integration/queue_runner/command_server/protocol/command_server_pb2.py +0 -0
  145. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/integration/queue_runner/command_server/protocol/command_server_pb2.pyi +0 -0
  146. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/integration/queue_runner/command_server/protocol/command_server_pb2_grpc.py +0 -0
  147. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/integration/queue_runner/command_server/types.py +0 -0
  148. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/integration/queue_runner/datastore/__init__.py +0 -0
  149. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/integration/queue_runner/datastore/datastore_sqlite.py +0 -0
  150. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/integration/queue_runner/datastore/interface.py +0 -0
  151. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/integration/queue_runner/datastore/model.py +0 -0
  152. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/integration/queue_runner/job_scheduler.py +0 -0
  153. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/integration/queue_runner/queue_runner.py +0 -0
  154. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/integration/queue_runner/types.py +0 -0
  155. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/integration/queue_runner/worker.py +0 -0
  156. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/integration/scan_profiles.py +0 -0
  157. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/integration/scheduler.py +0 -0
  158. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/integration/secret_retrieval/__init__.py +0 -0
  159. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/integration/secret_retrieval/retrieve_secret.py +0 -0
  160. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/integration/server.py +0 -0
  161. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/integration/telemetry.py +0 -0
  162. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/integration/webhook_server/entrypoint.py +0 -0
  163. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/py.typed +0 -0
  164. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/types/__init__.py +0 -0
  165. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/types/api/__init__.py +0 -0
  166. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/types/api/batch/__init__.py +0 -0
  167. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/types/api/batch/execute_batch.py +0 -0
  168. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/types/api/batch/execute_batch_load_async.py +0 -0
  169. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/types/api/chemical/__init__.py +0 -0
  170. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/types/api/chemical/convert_chemical_formats.py +0 -0
  171. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/types/api/entity/__init__.py +0 -0
  172. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/types/api/entity/create_entities.py +0 -0
  173. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/types/api/entity/create_entity.py +0 -0
  174. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/types/api/entity/create_or_update_entity.py +0 -0
  175. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/types/api/entity/get_entities_data.py +0 -0
  176. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/types/api/entity/grant_entity_permissions.py +0 -0
  177. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/types/api/entity/list_entities.py +0 -0
  178. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/types/api/entity/lock_entity.py +0 -0
  179. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/types/api/entity/resolve_entity_ids.py +0 -0
  180. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/types/api/entity/set_entity_field_values.py +0 -0
  181. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/types/api/entity/set_values.py +0 -0
  182. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/types/api/entity/transition_entity_phase.py +0 -0
  183. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/types/api/entity/unlock_entity.py +0 -0
  184. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/types/api/equipment/__init__.py +0 -0
  185. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/types/api/equipment/associate_equipment_input.py +0 -0
  186. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/types/api/field_options/__init__.py +0 -0
  187. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/types/api/field_options/upsert_field_options.py +0 -0
  188. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/types/api/files/__init__.py +0 -0
  189. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/types/api/files/download_file.py +0 -0
  190. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/types/api/id_source/__init__.py +0 -0
  191. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/types/api/id_source/list_id_source.py +0 -0
  192. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/types/api/id_source/match_id_source.py +0 -0
  193. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/types/api/input_groups/__init__.py +0 -0
  194. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/types/api/input_groups/get_input_group_names.py +0 -0
  195. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/types/api/inputs/__init__.py +0 -0
  196. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/types/api/inputs/create_inputs.py +0 -0
  197. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/types/api/inputs/get_input_data.py +0 -0
  198. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/types/api/inputs/get_input_names.py +0 -0
  199. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/types/api/inputs/get_inputs_data.py +0 -0
  200. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/types/api/inputs/set_input_attribute_values.py +0 -0
  201. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/types/api/inputs/set_input_category.py +0 -0
  202. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/types/api/inputs/set_input_subcategories.py +0 -0
  203. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/types/api/inputs/set_intermediate_type.py +0 -0
  204. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/types/api/material_families/__init__.py +0 -0
  205. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/types/api/material_families/update_entity_material_families.py +0 -0
  206. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/types/api/outputs/__init__.py +0 -0
  207. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/types/api/outputs/get_output_data.py +0 -0
  208. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/types/api/outputs/get_output_names.py +0 -0
  209. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/types/api/outputs/resolve_output_conditions.py +0 -0
  210. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/types/api/permissions/__init__.py +0 -0
  211. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/types/api/permissions/set_core_permissions.py +0 -0
  212. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/types/api/project/__init__.py +0 -0
  213. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/types/api/project/get_projects.py +0 -0
  214. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/types/api/project/get_projects_data.py +0 -0
  215. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/types/api/recipe_links/__init__.py +0 -0
  216. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/types/api/recipe_links/create_recipe_link.py +0 -0
  217. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/types/api/recipe_links/remove_recipe_link.py +0 -0
  218. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/types/api/recipe_metadata/__init__.py +0 -0
  219. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/types/api/recipe_metadata/get_recipe_metadata_data.py +0 -0
  220. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/types/api/recipes/__init__.py +0 -0
  221. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/types/api/recipes/add_recipe_to_project.py +0 -0
  222. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/types/api/recipes/archive_recipes.py +0 -0
  223. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/types/api/recipes/associate_recipe_as_input.py +0 -0
  224. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/types/api/recipes/associate_recipe_as_lot.py +0 -0
  225. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/types/api/recipes/clear_recipe_outputs.py +0 -0
  226. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/types/api/recipes/create_recipe.py +0 -0
  227. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/types/api/recipes/create_recipes.py +0 -0
  228. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/types/api/recipes/disassociate_recipe_as_input.py +0 -0
  229. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/types/api/recipes/get_column_calculation_values.py +0 -0
  230. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/types/api/recipes/get_curve.py +0 -0
  231. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/types/api/recipes/get_recipe_calculations.py +0 -0
  232. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/types/api/recipes/get_recipe_names.py +0 -0
  233. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/types/api/recipes/get_recipe_output_metadata.py +0 -0
  234. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/types/api/recipes/get_recipes_data.py +0 -0
  235. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/types/api/recipes/remove_recipe_from_project.py +0 -0
  236. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/types/api/recipes/set_recipe_inputs.py +0 -0
  237. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/types/api/recipes/set_recipe_metadata.py +0 -0
  238. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/types/api/recipes/set_recipe_output_annotations.py +0 -0
  239. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/types/api/recipes/set_recipe_output_file.py +0 -0
  240. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/types/api/recipes/set_recipe_tags.py +0 -0
  241. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/types/api/recipes/unarchive_recipes.py +0 -0
  242. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/types/api/triggers/__init__.py +0 -0
  243. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/types/api/triggers/run_trigger.py +0 -0
  244. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/types/api/uploader/__init__.py +0 -0
  245. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/types/api/uploader/invoke_uploader.py +0 -0
  246. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/types/async_batch.py +0 -0
  247. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/types/async_batch_processor.py +0 -0
  248. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/types/async_batch_t.py +0 -0
  249. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/types/async_jobs.py +0 -0
  250. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/types/async_jobs_t.py +0 -0
  251. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/types/auth_retrieval.py +0 -0
  252. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/types/auth_retrieval_t.py +0 -0
  253. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/types/base.py +0 -0
  254. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/types/base_t.py +0 -0
  255. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/types/calculations.py +0 -0
  256. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/types/calculations_t.py +0 -0
  257. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/types/chemical_structure.py +0 -0
  258. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/types/chemical_structure_t.py +0 -0
  259. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/types/client_config.py +0 -0
  260. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/types/curves.py +0 -0
  261. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/types/curves_t.py +0 -0
  262. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/types/entity.py +0 -0
  263. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/types/experiment_groups.py +0 -0
  264. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/types/experiment_groups_t.py +0 -0
  265. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/types/fields.py +0 -0
  266. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/types/fields_t.py +0 -0
  267. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/types/generic_upload.py +0 -0
  268. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/types/id_source.py +0 -0
  269. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/types/id_source_t.py +0 -0
  270. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/types/identifier.py +0 -0
  271. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/types/identifier_t.py +0 -0
  272. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/types/input_attributes.py +0 -0
  273. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/types/input_attributes_t.py +0 -0
  274. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/types/inputs.py +0 -0
  275. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/types/inputs_t.py +0 -0
  276. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/types/integration_server.py +0 -0
  277. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/types/integration_server_t.py +0 -0
  278. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/types/job_definition.py +0 -0
  279. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/types/outputs.py +0 -0
  280. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/types/outputs_t.py +0 -0
  281. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/types/overrides.py +0 -0
  282. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/types/overrides_t.py +0 -0
  283. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/types/permissions.py +0 -0
  284. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/types/permissions_t.py +0 -0
  285. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/types/phases.py +0 -0
  286. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/types/phases_t.py +0 -0
  287. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/types/post_base.py +0 -0
  288. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/types/post_base_t.py +0 -0
  289. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/types/queued_job.py +0 -0
  290. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/types/queued_job_t.py +0 -0
  291. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/types/recipe_identifiers.py +0 -0
  292. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/types/recipe_identifiers_t.py +0 -0
  293. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/types/recipe_inputs.py +0 -0
  294. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/types/recipe_inputs_t.py +0 -0
  295. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/types/recipe_links.py +0 -0
  296. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/types/recipe_links_t.py +0 -0
  297. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/types/recipe_metadata.py +0 -0
  298. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/types/recipe_metadata_t.py +0 -0
  299. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/types/recipe_output_metadata.py +0 -0
  300. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/types/recipe_output_metadata_t.py +0 -0
  301. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/types/recipe_tags.py +0 -0
  302. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/types/recipe_tags_t.py +0 -0
  303. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/types/recipe_workflow_steps.py +0 -0
  304. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/types/recipes.py +0 -0
  305. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/types/recipes_t.py +0 -0
  306. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/types/response.py +0 -0
  307. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/types/secret_retrieval.py +0 -0
  308. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/types/secret_retrieval_t.py +0 -0
  309. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/types/units.py +0 -0
  310. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/types/units_t.py +0 -0
  311. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/types/users.py +0 -0
  312. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/types/users_t.py +0 -0
  313. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/types/workflows.py +0 -0
  314. {uncountablepythonsdk-0.0.103 → uncountablepythonsdk-0.0.105}/uncountable/types/workflows_t.py +0 -0
@@ -11,6 +11,8 @@ jobs:
11
11
  steps:
12
12
  - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
13
13
  - uses: actions/setup-python@82c7e631bb3cdc910f68e0081d67478d79c6982d # v5
14
+ with:
15
+ python-version: '3.12'
14
16
  - uses: extractions/setup-crate@4993624604c307fbca528d28a3c8b60fa5ecc859 # v1
15
17
  with:
16
18
  repo: casey/just@0.10
@@ -23,7 +25,7 @@ jobs:
23
25
  - name: Install dependencies
24
26
  run: |
25
27
  # install the dependencies for the package
26
- uv pip install --system .
28
+ uv pip install .
27
29
  # install the dependencies for building the sphinx documentation
28
30
  just -f docs/justfile docs-setup-python
29
31
  - name: Sphinx build
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: UncountablePythonSDK
3
- Version: 0.0.103
3
+ Version: 0.0.105
4
4
  Summary: Uncountable SDK
5
5
  Project-URL: Homepage, https://github.com/uncountableinc/uncountable-python-sdk
6
6
  Project-URL: Repository, https://github.com/uncountableinc/uncountable-python-sdk.git
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: UncountablePythonSDK
3
- Version: 0.0.103
3
+ Version: 0.0.105
4
4
  Summary: Uncountable SDK
5
5
  Project-URL: Homepage, https://github.com/uncountableinc/uncountable-python-sdk
6
6
  Project-URL: Repository, https://github.com/uncountableinc/uncountable-python-sdk.git
@@ -1,6 +1,6 @@
1
1
  furo==2024.8.6
2
2
  myst-parser==4.0.0
3
- sphinx-autoapi==3.4.0
3
+ sphinx-autoapi==3.5.0
4
4
  sphinx-copybutton==0.5.2
5
5
  Sphinx==8.1.3
6
6
  sphinx_design==0.6.1
@@ -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,6 +99,22 @@ 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
 
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
+
100
118
  def _invoke_tuple_parsers[T](
101
119
  tuple_type: type[T],
102
120
  arg_parsers: typing.Sequence[typing.Callable[[typing.Any], object]],
@@ -155,7 +173,7 @@ def _build_parser_discriminated_union[T](
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)
@@ -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.
@@ -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:
@@ -17,6 +17,7 @@ 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)
20
21
 
21
22
 
22
23
  EMPTY_SERIAL_CLASS_DATA = _SerialClassData()
@@ -30,6 +31,7 @@ def serial_class(
30
31
  parse_require: set[str] | None = None,
31
32
  named_type_path: str | None = None,
32
33
  is_dynamic_allowed: bool = False,
34
+ explicit_defaults: set[str] | None = None,
33
35
  ) -> Callable[[ClassT], ClassT]:
34
36
  """
35
37
  An additional decorator to a dataclass that specifies serialization options.
@@ -52,6 +54,9 @@ def serial_class(
52
54
  requiring them for the API input.
53
55
  @param named_type_path
54
56
  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.
55
60
  """
56
61
 
57
62
  def decorate(orig_class: ClassT) -> ClassT:
@@ -63,6 +68,7 @@ def serial_class(
63
68
  named_type_path=named_type_path,
64
69
  from_decorator=True,
65
70
  is_dynamic_allowed=is_dynamic_allowed,
71
+ explicit_defaults=explicit_defaults or set(),
66
72
  )
67
73
  return orig_class
68
74
 
@@ -90,6 +96,9 @@ class SerialClassDataInspector(SerialInspector[ClassT]):
90
96
  def has_parse_require(self, key: str) -> bool:
91
97
  return key in self.current.parse_require
92
98
 
99
+ def has_explicit_default(self, key: str) -> bool:
100
+ return key in self.current.explicit_defaults
101
+
93
102
 
94
103
  def get_merged_serial_class_data(type_class: type[Any]) -> _SerialClassData | None:
95
104
  base_class_data = (
@@ -115,6 +124,8 @@ def get_merged_serial_class_data(type_class: type[Any]) -> _SerialClassData | No
115
124
  | curr_base_class_data.to_string_values,
116
125
  parse_require=base_class_data.parse_require
117
126
  | curr_base_class_data.parse_require,
127
+ explicit_defaults=base_class_data.explicit_defaults
128
+ | curr_base_class_data.explicit_defaults,
118
129
  )
119
130
  return base_class_data
120
131
 
@@ -62,6 +62,7 @@ class SpecProperty:
62
62
  # Holds extra information that will be emitted along with type_info. The builder knows nothing
63
63
  # about the contents of this information.
64
64
  ext_info: Any = None
65
+ explicit_default: bool = False
65
66
 
66
67
 
67
68
  class NameCase(StrEnum):
@@ -389,6 +390,7 @@ class SpecTypeDefn(SpecType):
389
390
  ptype = builder.parse_type(self.namespace, data_type, scope=self)
390
391
 
391
392
  default_spec = data.get("default", MISSING)
393
+ explicit_default = default_spec != MISSING
392
394
  if default_spec == MISSING:
393
395
  has_default = False
394
396
  default = None
@@ -396,7 +398,10 @@ class SpecTypeDefn(SpecType):
396
398
  has_default = True
397
399
  # IMPROVE: check the type against the ptype
398
400
  default = default_spec
399
-
401
+ if extant == PropertyExtant.missing and explicit_default:
402
+ raise Exception(
403
+ f"cannot have extant missing and default for property {name}"
404
+ )
400
405
  parse_require = False
401
406
  literal = unwrap_literal_type(ptype)
402
407
  if literal is not None:
@@ -419,6 +424,7 @@ class SpecTypeDefn(SpecType):
419
424
  parse_require=parse_require,
420
425
  desc=data.get("desc", None),
421
426
  ext_info=ext_info,
427
+ explicit_default=explicit_default,
422
428
  )
423
429
  finally:
424
430
  builder.pop_where()
@@ -697,6 +697,7 @@ 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]
700
701
 
701
702
 
702
703
  def _emit_type_properties(
@@ -728,6 +729,7 @@ def _emit_properties(
728
729
  unconverted_values: set[str] = set()
729
730
  to_string_values: set[str] = set()
730
731
  parse_require: set[str] = set()
732
+ explicit_defaults: set[str] = set()
731
733
 
732
734
  if len(properties) > 0:
733
735
 
@@ -748,6 +750,9 @@ def _emit_properties(
748
750
  if prop.parse_require:
749
751
  parse_require.add(py_name)
750
752
 
753
+ if prop.explicit_default:
754
+ explicit_defaults.add(py_name)
755
+
751
756
  ref_type = refer_to(ctx, stype)
752
757
  default = None
753
758
  if prop.extant == builder.PropertyExtant.missing:
@@ -791,6 +796,7 @@ def _emit_properties(
791
796
  unconverted_values=unconverted_values,
792
797
  to_string_values=to_string_values,
793
798
  parse_require=parse_require,
799
+ explicit_defaults=explicit_defaults,
794
800
  )
795
801
 
796
802
 
@@ -881,6 +887,7 @@ def _emit_type(ctx: Context, stype: builder.SpecType) -> None:
881
887
  unconverted_values = emitted_properties_metadata.unconverted_values
882
888
  to_string_values = emitted_properties_metadata.to_string_values
883
889
  parse_require = emitted_properties_metadata.parse_require
890
+ explicit_defaults = emitted_properties_metadata.explicit_defaults
884
891
 
885
892
  _emit_generics(ctx, generics)
886
893
 
@@ -902,6 +909,7 @@ def _emit_type(ctx: Context, stype: builder.SpecType) -> None:
902
909
  write_values("unconverted_values", unconverted_values)
903
910
  write_values("to_string_values", to_string_values)
904
911
  write_values("parse_require", parse_require)
912
+ write_values("explicit_defaults", explicit_defaults)
905
913
 
906
914
  ctx.out.write(")\n")
907
915
 
@@ -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
@@ -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] = [
@@ -49,11 +50,13 @@ class LookupEntityQueryBase:
49
50
  @serial_class(
50
51
  named_type_path="sdk.api.entity.lookup_entity.LookupFieldArgumentValue",
51
52
  unconverted_values={"field_value"},
53
+ explicit_defaults={"value_resolution"},
52
54
  )
53
55
  @dataclasses.dataclass(kw_only=True)
54
56
  class LookupFieldArgumentValue:
55
57
  field_key: identifier_t.IdentifierKey
56
58
  field_value: base_t.JsonValue
59
+ value_resolution: field_values_t.ValueResolution = field_values_t.ValueResolution.DIRECT
57
60
 
58
61
 
59
62
  # DO NOT MODIFY -- This file is generated by type_spec
@@ -45,6 +45,7 @@ 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"},
48
49
  )
49
50
  @dataclasses.dataclass(kw_only=True)
50
51
  class Arguments:
@@ -81,6 +81,7 @@ class RecipeInputEditClearInputs(RecipeInputEditBase):
81
81
  @serial_class(
82
82
  named_type_path="sdk.api.recipes.edit_recipe_inputs.RecipeInputEditInputBase",
83
83
  to_string_values={"value_numeric"},
84
+ explicit_defaults={"input_value_type", "quantity_basis"},
84
85
  )
85
86
  @dataclasses.dataclass(kw_only=True)
86
87
  class RecipeInputEditInputBase(RecipeInputEditBase):
@@ -196,6 +197,7 @@ class PlaceholderDisplayMode(StrEnum):
196
197
  # DO NOT MODIFY -- This file is generated by type_spec
197
198
  @serial_class(
198
199
  named_type_path="sdk.api.recipes.edit_recipe_inputs.PlaceholderBase",
200
+ explicit_defaults={"display_mode", "require_for_creation"},
199
201
  )
200
202
  @dataclasses.dataclass(kw_only=True)
201
203
  class PlaceholderBase:
@@ -25,6 +25,7 @@ ENDPOINT_PATH = "api/external/recipes/external_get_recipe_links"
25
25
  # DO NOT MODIFY -- This file is generated by type_spec
26
26
  @serial_class(
27
27
  named_type_path="sdk.api.recipes.get_recipe_links.Arguments",
28
+ explicit_defaults={"depth"},
28
29
  )
29
30
  @dataclasses.dataclass(kw_only=True)
30
31
  class Arguments:
@@ -42,6 +42,7 @@ class RecipeLockBase:
42
42
  # DO NOT MODIFY -- This file is generated by type_spec
43
43
  @serial_class(
44
44
  named_type_path="sdk.api.recipes.lock_recipes.Arguments",
45
+ explicit_defaults={"type"},
45
46
  )
46
47
  @dataclasses.dataclass(kw_only=True)
47
48
  class Arguments:
@@ -48,6 +48,7 @@ class NullBehavior(StrEnum):
48
48
  @serial_class(
49
49
  named_type_path="sdk.api.recipes.set_recipe_outputs.RecipeOutputValue",
50
50
  to_string_values={"value_numeric"},
51
+ explicit_defaults={"null_behavior"},
51
52
  )
52
53
  @dataclasses.dataclass(kw_only=True)
53
54
  class RecipeOutputValue:
@@ -31,6 +31,7 @@ class RecipeUnlockType(StrEnum):
31
31
  # DO NOT MODIFY -- This file is generated by type_spec
32
32
  @serial_class(
33
33
  named_type_path="sdk.api.recipes.unlock_recipes.Arguments",
34
+ explicit_defaults={"type"},
34
35
  )
35
36
  @dataclasses.dataclass(kw_only=True)
36
37
  class Arguments:
@@ -57,6 +57,7 @@ import uncountable.types.api.entity.list_entities as list_entities_t
57
57
  import uncountable.types.api.id_source.list_id_source as list_id_source_t
58
58
  import uncountable.types.api.entity.lock_entity as lock_entity_t
59
59
  import uncountable.types.api.recipes.lock_recipes as lock_recipes_t
60
+ import uncountable.types.api.entity.lookup_entity as lookup_entity_t
60
61
  import uncountable.types.api.id_source.match_id_source as match_id_source_t
61
62
  from uncountable.types import permissions_t
62
63
  from uncountable.types import post_base_t
@@ -1127,6 +1128,26 @@ class ClientMethods(ABC):
1127
1128
  )
1128
1129
  return self.do_request(api_request=api_request, return_type=lock_recipes_t.Data)
1129
1130
 
1131
+ def lookup_entity(
1132
+ self,
1133
+ *,
1134
+ entity_type: entity_t.EntityType,
1135
+ query: lookup_entity_t.LookupEntityQuery,
1136
+ ) -> lookup_entity_t.Data:
1137
+ """Look up an entity based on an identifier or field values
1138
+
1139
+ """
1140
+ args = lookup_entity_t.Arguments(
1141
+ entity_type=entity_type,
1142
+ query=query,
1143
+ )
1144
+ api_request = APIRequest(
1145
+ method=lookup_entity_t.ENDPOINT_METHOD,
1146
+ endpoint=lookup_entity_t.ENDPOINT_PATH,
1147
+ args=args,
1148
+ )
1149
+ return self.do_request(api_request=api_request, return_type=lookup_entity_t.Data)
1150
+
1130
1151
  def match_id_source(
1131
1152
  self,
1132
1153
  *,
@@ -17,6 +17,7 @@ __all__: list[str] = [
17
17
  # DO NOT MODIFY -- This file is generated by type_spec
18
18
  @serial_class(
19
19
  named_type_path="sdk.client_config.ClientConfigOptions",
20
+ explicit_defaults={"allow_insecure_tls"},
20
21
  )
21
22
  @dataclasses.dataclass(kw_only=True)
22
23
  class ClientConfigOptions: