UncountablePythonSDK 0.0.101__tar.gz → 0.0.104__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 (313) hide show
  1. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/.github/workflows/documentation.yml +9 -1
  2. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/.github/workflows/publish.yml +8 -2
  3. {uncountablepythonsdk-0.0.101/UncountablePythonSDK.egg-info → uncountablepythonsdk-0.0.104}/PKG-INFO +2 -2
  4. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104/UncountablePythonSDK.egg-info}/PKG-INFO +2 -2
  5. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/UncountablePythonSDK.egg-info/SOURCES.txt +2 -0
  6. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/UncountablePythonSDK.egg-info/requires.txt +1 -1
  7. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/docs/justfile +2 -2
  8. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/examples/integration-server/jobs/materials_auto/example_wh.py +4 -0
  9. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/examples/integration-server/pyproject.toml +4 -4
  10. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/pkgs/argument_parser/__init__.py +1 -0
  11. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/pkgs/argument_parser/argument_parser.py +30 -20
  12. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/pkgs/serialization/serial_class.py +21 -10
  13. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/pkgs/type_spec/builder.py +3 -7
  14. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/pkgs/type_spec/config.py +5 -1
  15. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/pkgs/type_spec/emit_open_api.py +23 -13
  16. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/pkgs/type_spec/emit_open_api_util.py +0 -1
  17. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/pkgs/type_spec/emit_python.py +13 -1
  18. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/pkgs/type_spec/type_info/__main__.py +3 -1
  19. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/pkgs/type_spec/type_info/emit_type_info.py +34 -5
  20. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/pyproject.toml +1 -1
  21. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/core/client.py +2 -2
  22. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/integration/telemetry.py +1 -1
  23. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/types/__init__.py +4 -0
  24. uncountablepythonsdk-0.0.104/uncountable/types/api/entity/lookup_entity.py +100 -0
  25. uncountablepythonsdk-0.0.104/uncountable/types/api/recipes/add_time_series_data.py +64 -0
  26. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/types/api/recipes/edit_recipe_inputs.py +2 -0
  27. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/types/api/recipes/get_recipe_links.py +1 -0
  28. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/types/api/recipes/lock_recipes.py +1 -0
  29. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/types/api/recipes/set_recipe_outputs.py +10 -0
  30. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/types/api/recipes/unlock_recipes.py +1 -0
  31. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/types/async_batch_processor.py +34 -0
  32. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/types/async_batch_t.py +2 -0
  33. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/types/client_base.py +26 -0
  34. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/types/client_config_t.py +1 -0
  35. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/types/entity_t.py +5 -1
  36. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/types/field_values.py +4 -0
  37. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/types/field_values_t.py +50 -1
  38. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/types/generic_upload_t.py +1 -0
  39. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/types/job_definition_t.py +2 -0
  40. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/types/recipe_workflow_steps_t.py +1 -0
  41. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/types/response_t.py +1 -0
  42. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/.gitignore +0 -0
  43. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/README.md +0 -0
  44. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/UncountablePythonSDK.egg-info/dependency_links.txt +0 -0
  45. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/UncountablePythonSDK.egg-info/top_level.txt +0 -0
  46. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/docs/.gitignore +0 -0
  47. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/docs/conf.py +0 -0
  48. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/docs/index.md +0 -0
  49. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/docs/quickstart.md +0 -0
  50. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/docs/requirements.txt +0 -0
  51. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/docs/static/favicons/android-chrome-192x192.png +0 -0
  52. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/docs/static/favicons/android-chrome-512x512.png +0 -0
  53. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/docs/static/favicons/apple-touch-icon.png +0 -0
  54. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/docs/static/favicons/browserconfig.xml +0 -0
  55. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/docs/static/favicons/favicon-16x16.png +0 -0
  56. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/docs/static/favicons/favicon-32x32.png +0 -0
  57. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/docs/static/favicons/manifest.json +0 -0
  58. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/docs/static/favicons/mstile-150x150.png +0 -0
  59. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/docs/static/favicons/safari-pinned-tab.svg +0 -0
  60. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/docs/static/logo_blue.png +0 -0
  61. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/examples/async_batch.py +0 -0
  62. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/examples/create_entity.py +0 -0
  63. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/examples/download_files.py +0 -0
  64. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/examples/edit_recipe_inputs.py +0 -0
  65. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/examples/integration-server/jobs/materials_auto/example_cron.py +0 -0
  66. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/examples/integration-server/jobs/materials_auto/profile.yaml +0 -0
  67. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/examples/invoke_uploader.py +0 -0
  68. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/examples/set_recipe_metadata_file.py +0 -0
  69. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/examples/set_recipe_output_file_sdk.py +0 -0
  70. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/examples/upload_files.py +0 -0
  71. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/pkgs/__init__.py +0 -0
  72. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/pkgs/argument_parser/_is_enum.py +0 -0
  73. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/pkgs/argument_parser/_is_namedtuple.py +0 -0
  74. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/pkgs/argument_parser/case_convert.py +0 -0
  75. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/pkgs/filesystem_utils/__init__.py +0 -0
  76. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/pkgs/filesystem_utils/_blob_session.py +0 -0
  77. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/pkgs/filesystem_utils/_gdrive_session.py +0 -0
  78. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/pkgs/filesystem_utils/_local_session.py +0 -0
  79. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/pkgs/filesystem_utils/_s3_session.py +0 -0
  80. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/pkgs/filesystem_utils/_sftp_session.py +0 -0
  81. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/pkgs/filesystem_utils/file_type_utils.py +0 -0
  82. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/pkgs/filesystem_utils/filesystem_session.py +0 -0
  83. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/pkgs/py.typed +0 -0
  84. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/pkgs/serialization/__init__.py +0 -0
  85. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/pkgs/serialization/annotation.py +0 -0
  86. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/pkgs/serialization/missing_sentry.py +0 -0
  87. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/pkgs/serialization/opaque_key.py +0 -0
  88. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/pkgs/serialization/serial_alias.py +0 -0
  89. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/pkgs/serialization/serial_generic.py +0 -0
  90. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/pkgs/serialization/serial_union.py +0 -0
  91. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/pkgs/serialization/yaml.py +0 -0
  92. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/pkgs/serialization_util/__init__.py +0 -0
  93. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/pkgs/serialization_util/_get_type_for_serialization.py +0 -0
  94. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/pkgs/serialization_util/convert_to_snakecase.py +0 -0
  95. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/pkgs/serialization_util/dataclasses.py +0 -0
  96. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/pkgs/serialization_util/serialization_helpers.py +0 -0
  97. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/pkgs/strenum_compat/__init__.py +0 -0
  98. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/pkgs/strenum_compat/strenum_compat.py +0 -0
  99. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/pkgs/type_spec/__init__.py +0 -0
  100. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/pkgs/type_spec/__main__.py +0 -0
  101. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/pkgs/type_spec/actions_registry/__init__.py +0 -0
  102. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/pkgs/type_spec/actions_registry/__main__.py +0 -0
  103. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/pkgs/type_spec/actions_registry/emit_typescript.py +0 -0
  104. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/pkgs/type_spec/cross_output_links.py +0 -0
  105. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/pkgs/type_spec/emit_io_ts.py +0 -0
  106. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/pkgs/type_spec/emit_typescript.py +0 -0
  107. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/pkgs/type_spec/emit_typescript_util.py +0 -0
  108. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/pkgs/type_spec/load_types.py +0 -0
  109. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/pkgs/type_spec/open_api_util.py +0 -0
  110. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/pkgs/type_spec/parts/base.py.prepart +0 -0
  111. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/pkgs/type_spec/parts/base.ts.prepart +0 -0
  112. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/pkgs/type_spec/test.py +0 -0
  113. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/pkgs/type_spec/util.py +0 -0
  114. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/pkgs/type_spec/value_spec/__init__.py +0 -0
  115. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/pkgs/type_spec/value_spec/__main__.py +0 -0
  116. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/pkgs/type_spec/value_spec/convert_type.py +0 -0
  117. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/pkgs/type_spec/value_spec/emit_python.py +0 -0
  118. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/pkgs/type_spec/value_spec/types.py +0 -0
  119. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/setup.cfg +0 -0
  120. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/__init__.py +0 -0
  121. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/core/__init__.py +0 -0
  122. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/core/async_batch.py +0 -0
  123. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/core/environment.py +0 -0
  124. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/core/file_upload.py +0 -0
  125. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/core/types.py +0 -0
  126. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/integration/__init__.py +0 -0
  127. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/integration/cli.py +0 -0
  128. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/integration/construct_client.py +0 -0
  129. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/integration/cron.py +0 -0
  130. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/integration/db/__init__.py +0 -0
  131. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/integration/db/connect.py +0 -0
  132. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/integration/db/session.py +0 -0
  133. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/integration/entrypoint.py +0 -0
  134. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/integration/executors/__init__.py +0 -0
  135. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/integration/executors/executors.py +0 -0
  136. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/integration/executors/generic_upload_executor.py +0 -0
  137. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/integration/executors/script_executor.py +0 -0
  138. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/integration/job.py +0 -0
  139. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/integration/queue_runner/__init__.py +0 -0
  140. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/integration/queue_runner/command_server/__init__.py +0 -0
  141. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/integration/queue_runner/command_server/command_client.py +0 -0
  142. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/integration/queue_runner/command_server/command_server.py +0 -0
  143. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/integration/queue_runner/command_server/protocol/__init__.py +0 -0
  144. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/integration/queue_runner/command_server/protocol/command_server.proto +0 -0
  145. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/integration/queue_runner/command_server/protocol/command_server_pb2.py +0 -0
  146. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/integration/queue_runner/command_server/protocol/command_server_pb2.pyi +0 -0
  147. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/integration/queue_runner/command_server/protocol/command_server_pb2_grpc.py +0 -0
  148. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/integration/queue_runner/command_server/types.py +0 -0
  149. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/integration/queue_runner/datastore/__init__.py +0 -0
  150. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/integration/queue_runner/datastore/datastore_sqlite.py +0 -0
  151. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/integration/queue_runner/datastore/interface.py +0 -0
  152. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/integration/queue_runner/datastore/model.py +0 -0
  153. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/integration/queue_runner/job_scheduler.py +0 -0
  154. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/integration/queue_runner/queue_runner.py +0 -0
  155. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/integration/queue_runner/types.py +0 -0
  156. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/integration/queue_runner/worker.py +0 -0
  157. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/integration/scan_profiles.py +0 -0
  158. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/integration/scheduler.py +0 -0
  159. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/integration/secret_retrieval/__init__.py +0 -0
  160. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/integration/secret_retrieval/retrieve_secret.py +0 -0
  161. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/integration/server.py +0 -0
  162. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/integration/webhook_server/entrypoint.py +0 -0
  163. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/py.typed +0 -0
  164. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/types/api/__init__.py +0 -0
  165. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/types/api/batch/__init__.py +0 -0
  166. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/types/api/batch/execute_batch.py +0 -0
  167. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/types/api/batch/execute_batch_load_async.py +0 -0
  168. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/types/api/chemical/__init__.py +0 -0
  169. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/types/api/chemical/convert_chemical_formats.py +0 -0
  170. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/types/api/entity/__init__.py +0 -0
  171. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/types/api/entity/create_entities.py +0 -0
  172. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/types/api/entity/create_entity.py +0 -0
  173. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/types/api/entity/create_or_update_entity.py +0 -0
  174. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/types/api/entity/get_entities_data.py +0 -0
  175. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/types/api/entity/grant_entity_permissions.py +0 -0
  176. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/types/api/entity/list_entities.py +0 -0
  177. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/types/api/entity/lock_entity.py +0 -0
  178. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/types/api/entity/resolve_entity_ids.py +0 -0
  179. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/types/api/entity/set_entity_field_values.py +0 -0
  180. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/types/api/entity/set_values.py +0 -0
  181. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/types/api/entity/transition_entity_phase.py +0 -0
  182. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/types/api/entity/unlock_entity.py +0 -0
  183. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/types/api/equipment/__init__.py +0 -0
  184. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/types/api/equipment/associate_equipment_input.py +0 -0
  185. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/types/api/field_options/__init__.py +0 -0
  186. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/types/api/field_options/upsert_field_options.py +0 -0
  187. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/types/api/files/__init__.py +0 -0
  188. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/types/api/files/download_file.py +0 -0
  189. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/types/api/id_source/__init__.py +0 -0
  190. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/types/api/id_source/list_id_source.py +0 -0
  191. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/types/api/id_source/match_id_source.py +0 -0
  192. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/types/api/input_groups/__init__.py +0 -0
  193. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/types/api/input_groups/get_input_group_names.py +0 -0
  194. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/types/api/inputs/__init__.py +0 -0
  195. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/types/api/inputs/create_inputs.py +0 -0
  196. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/types/api/inputs/get_input_data.py +0 -0
  197. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/types/api/inputs/get_input_names.py +0 -0
  198. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/types/api/inputs/get_inputs_data.py +0 -0
  199. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/types/api/inputs/set_input_attribute_values.py +0 -0
  200. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/types/api/inputs/set_input_category.py +0 -0
  201. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/types/api/inputs/set_input_subcategories.py +0 -0
  202. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/types/api/inputs/set_intermediate_type.py +0 -0
  203. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/types/api/material_families/__init__.py +0 -0
  204. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/types/api/material_families/update_entity_material_families.py +0 -0
  205. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/types/api/outputs/__init__.py +0 -0
  206. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/types/api/outputs/get_output_data.py +0 -0
  207. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/types/api/outputs/get_output_names.py +0 -0
  208. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/types/api/outputs/resolve_output_conditions.py +0 -0
  209. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/types/api/permissions/__init__.py +0 -0
  210. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/types/api/permissions/set_core_permissions.py +0 -0
  211. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/types/api/project/__init__.py +0 -0
  212. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/types/api/project/get_projects.py +0 -0
  213. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/types/api/project/get_projects_data.py +0 -0
  214. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/types/api/recipe_links/__init__.py +0 -0
  215. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/types/api/recipe_links/create_recipe_link.py +0 -0
  216. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/types/api/recipe_links/remove_recipe_link.py +0 -0
  217. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/types/api/recipe_metadata/__init__.py +0 -0
  218. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/types/api/recipe_metadata/get_recipe_metadata_data.py +0 -0
  219. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/types/api/recipes/__init__.py +0 -0
  220. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/types/api/recipes/add_recipe_to_project.py +0 -0
  221. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/types/api/recipes/archive_recipes.py +0 -0
  222. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/types/api/recipes/associate_recipe_as_input.py +0 -0
  223. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/types/api/recipes/associate_recipe_as_lot.py +0 -0
  224. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/types/api/recipes/clear_recipe_outputs.py +0 -0
  225. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/types/api/recipes/create_recipe.py +0 -0
  226. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/types/api/recipes/create_recipes.py +0 -0
  227. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/types/api/recipes/disassociate_recipe_as_input.py +0 -0
  228. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/types/api/recipes/get_column_calculation_values.py +0 -0
  229. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/types/api/recipes/get_curve.py +0 -0
  230. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/types/api/recipes/get_recipe_calculations.py +0 -0
  231. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/types/api/recipes/get_recipe_names.py +0 -0
  232. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/types/api/recipes/get_recipe_output_metadata.py +0 -0
  233. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/types/api/recipes/get_recipes_data.py +0 -0
  234. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/types/api/recipes/remove_recipe_from_project.py +0 -0
  235. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/types/api/recipes/set_recipe_inputs.py +0 -0
  236. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/types/api/recipes/set_recipe_metadata.py +0 -0
  237. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/types/api/recipes/set_recipe_output_annotations.py +0 -0
  238. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/types/api/recipes/set_recipe_output_file.py +0 -0
  239. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/types/api/recipes/set_recipe_tags.py +0 -0
  240. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/types/api/recipes/unarchive_recipes.py +0 -0
  241. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/types/api/triggers/__init__.py +0 -0
  242. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/types/api/triggers/run_trigger.py +0 -0
  243. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/types/api/uploader/__init__.py +0 -0
  244. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/types/api/uploader/invoke_uploader.py +0 -0
  245. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/types/async_batch.py +0 -0
  246. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/types/async_jobs.py +0 -0
  247. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/types/async_jobs_t.py +0 -0
  248. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/types/auth_retrieval.py +0 -0
  249. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/types/auth_retrieval_t.py +0 -0
  250. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/types/base.py +0 -0
  251. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/types/base_t.py +0 -0
  252. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/types/calculations.py +0 -0
  253. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/types/calculations_t.py +0 -0
  254. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/types/chemical_structure.py +0 -0
  255. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/types/chemical_structure_t.py +0 -0
  256. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/types/client_config.py +0 -0
  257. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/types/curves.py +0 -0
  258. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/types/curves_t.py +0 -0
  259. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/types/entity.py +0 -0
  260. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/types/experiment_groups.py +0 -0
  261. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/types/experiment_groups_t.py +0 -0
  262. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/types/fields.py +0 -0
  263. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/types/fields_t.py +0 -0
  264. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/types/generic_upload.py +0 -0
  265. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/types/id_source.py +0 -0
  266. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/types/id_source_t.py +0 -0
  267. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/types/identifier.py +0 -0
  268. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/types/identifier_t.py +0 -0
  269. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/types/input_attributes.py +0 -0
  270. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/types/input_attributes_t.py +0 -0
  271. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/types/inputs.py +0 -0
  272. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/types/inputs_t.py +0 -0
  273. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/types/integration_server.py +0 -0
  274. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/types/integration_server_t.py +0 -0
  275. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/types/job_definition.py +0 -0
  276. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/types/outputs.py +0 -0
  277. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/types/outputs_t.py +0 -0
  278. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/types/overrides.py +0 -0
  279. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/types/overrides_t.py +0 -0
  280. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/types/permissions.py +0 -0
  281. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/types/permissions_t.py +0 -0
  282. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/types/phases.py +0 -0
  283. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/types/phases_t.py +0 -0
  284. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/types/post_base.py +0 -0
  285. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/types/post_base_t.py +0 -0
  286. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/types/queued_job.py +0 -0
  287. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/types/queued_job_t.py +0 -0
  288. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/types/recipe_identifiers.py +0 -0
  289. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/types/recipe_identifiers_t.py +0 -0
  290. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/types/recipe_inputs.py +0 -0
  291. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/types/recipe_inputs_t.py +0 -0
  292. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/types/recipe_links.py +0 -0
  293. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/types/recipe_links_t.py +0 -0
  294. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/types/recipe_metadata.py +0 -0
  295. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/types/recipe_metadata_t.py +0 -0
  296. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/types/recipe_output_metadata.py +0 -0
  297. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/types/recipe_output_metadata_t.py +0 -0
  298. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/types/recipe_tags.py +0 -0
  299. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/types/recipe_tags_t.py +0 -0
  300. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/types/recipe_workflow_steps.py +0 -0
  301. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/types/recipes.py +0 -0
  302. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/types/recipes_t.py +0 -0
  303. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/types/response.py +0 -0
  304. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/types/secret_retrieval.py +0 -0
  305. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/types/secret_retrieval_t.py +0 -0
  306. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/types/units.py +0 -0
  307. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/types/units_t.py +0 -0
  308. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/types/users.py +0 -0
  309. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/types/users_t.py +0 -0
  310. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/types/webhook_job.py +0 -0
  311. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/types/webhook_job_t.py +0 -0
  312. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/types/workflows.py +0 -0
  313. {uncountablepythonsdk-0.0.101 → uncountablepythonsdk-0.0.104}/uncountable/types/workflows_t.py +0 -0
@@ -11,13 +11,21 @@ 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
19
+ - name: Set up UV
20
+ uses: astral-sh/setup-uv@4db96194c378173c656ce18a155ffc14a9fc4355 # v5
21
+ with:
22
+ version: "0.6.1"
23
+ python-version: "3.12"
24
+ enable-cache: true
17
25
  - name: Install dependencies
18
26
  run: |
19
27
  # install the dependencies for the package
20
- pip install .
28
+ uv pip install .
21
29
  # install the dependencies for building the sphinx documentation
22
30
  just -f docs/justfile docs-setup-python
23
31
  - name: Sphinx build
@@ -24,10 +24,16 @@ jobs:
24
24
  fetch-depth: 0
25
25
  - uses: actions/setup-python@82c7e631bb3cdc910f68e0081d67478d79c6982d # v5
26
26
  with:
27
- python-version: '3.11'
27
+ python-version: '3.12'
28
+ - name: Set up UV
29
+ uses: astral-sh/setup-uv@4db96194c378173c656ce18a155ffc14a9fc4355 # v5
30
+ with:
31
+ version: "0.6.1"
32
+ python-version: "3.12"
33
+ enable-cache: true
28
34
  - name: Install build dependencies
29
35
  run: |
30
- python3 -m pip install --upgrade build
36
+ uv pip install --upgrade build
31
37
  - name: Build distributions and wheels
32
38
  run: |
33
39
  python3 -m build
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: UncountablePythonSDK
3
- Version: 0.0.101
3
+ Version: 0.0.104
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
@@ -38,7 +38,7 @@ Requires-Dist: simplejson==3.*
38
38
  Requires-Dist: grpcio==1.67.1
39
39
  Requires-Dist: protobuf>=4.21.1
40
40
  Requires-Dist: azure-storage-blob==12.*
41
- Requires-Dist: boto3-stubs[essential,ses]==1.36.4
41
+ Requires-Dist: boto3-stubs[essential,ses]==1.*
42
42
  Provides-Extra: test
43
43
  Requires-Dist: mypy==1.*; extra == "test"
44
44
  Requires-Dist: ruff==0.*; extra == "test"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: UncountablePythonSDK
3
- Version: 0.0.101
3
+ Version: 0.0.104
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
@@ -38,7 +38,7 @@ Requires-Dist: simplejson==3.*
38
38
  Requires-Dist: grpcio==1.67.1
39
39
  Requires-Dist: protobuf>=4.21.1
40
40
  Requires-Dist: azure-storage-blob==12.*
41
- Requires-Dist: boto3-stubs[essential,ses]==1.36.4
41
+ Requires-Dist: boto3-stubs[essential,ses]==1.*
42
42
  Provides-Extra: test
43
43
  Requires-Dist: mypy==1.*; extra == "test"
44
44
  Requires-Dist: ruff==0.*; extra == "test"
@@ -235,6 +235,7 @@ uncountable/types/api/entity/get_entities_data.py
235
235
  uncountable/types/api/entity/grant_entity_permissions.py
236
236
  uncountable/types/api/entity/list_entities.py
237
237
  uncountable/types/api/entity/lock_entity.py
238
+ uncountable/types/api/entity/lookup_entity.py
238
239
  uncountable/types/api/entity/resolve_entity_ids.py
239
240
  uncountable/types/api/entity/set_entity_field_values.py
240
241
  uncountable/types/api/entity/set_values.py
@@ -278,6 +279,7 @@ uncountable/types/api/recipe_metadata/__init__.py
278
279
  uncountable/types/api/recipe_metadata/get_recipe_metadata_data.py
279
280
  uncountable/types/api/recipes/__init__.py
280
281
  uncountable/types/api/recipes/add_recipe_to_project.py
282
+ uncountable/types/api/recipes/add_time_series_data.py
281
283
  uncountable/types/api/recipes/archive_recipes.py
282
284
  uncountable/types/api/recipes/associate_recipe_as_input.py
283
285
  uncountable/types/api/recipes/associate_recipe_as_lot.py
@@ -20,7 +20,7 @@ simplejson==3.*
20
20
  grpcio==1.67.1
21
21
  protobuf>=4.21.1
22
22
  azure-storage-blob==12.*
23
- boto3-stubs[essential,ses]==1.36.4
23
+ boto3-stubs[essential,ses]==1.*
24
24
 
25
25
  [test]
26
26
  mypy==1.*
@@ -1,5 +1,6 @@
1
1
  docs-setup-python:
2
- pip install -r requirements.txt
2
+ curl -LsSf https://astral.sh/uv/0.6.1/install.sh | sh
3
+ uv pip install -r requirements.txt
3
4
 
4
5
  docs-clean:
5
6
  rm -rf _build/
@@ -9,4 +10,3 @@ docs-build: docs-clean
9
10
 
10
11
  docs-serve: docs-build
11
12
  npx serve _build/dirhtml
12
-
@@ -13,3 +13,7 @@ class WebhookExample(WebhookJob):
13
13
  def run(self, args: JobArguments, payload: typing.Any) -> JobResult:
14
14
  args.logger.log_info(f"webhook invoked with payload: {payload}")
15
15
  return JobResult(success=True)
16
+
17
+ @property
18
+ def webhook_payload_type(self) -> typing.Any:
19
+ return dict
@@ -12,7 +12,7 @@ dependencies = [
12
12
  "types-paramiko ==3.5.0.20240918",
13
13
  "types-openpyxl == 3.*",
14
14
  "types-pysftp == 0.*",
15
- "types-pytz == 2024.*",
15
+ "types-pytz ==2025.*",
16
16
  "types-requests == 2.*",
17
17
  "types-simplejson == 3.*",
18
18
  "pandas-stubs",
@@ -173,9 +173,9 @@ lint.ignore = [
173
173
  "SLOT000", # subclass of string should define slot. should add
174
174
  "T201", # print. skip
175
175
  "T203", # pprint. skip
176
- "TCH001", # move application import into type checking. skip
177
- "TCH002", # move third party import into type checking. consider
178
- "TCH003", # move library into type checking lbock. consider
176
+ "TC001", # move application import into type checking. skip
177
+ "TC002", # move third party import into type checking. consider
178
+ "TC003", # move library into type checking lbock. consider
179
179
  "TD", # todo comments. skip
180
180
  "TID252", # eliminate relative imports from parents. skip
181
181
  "TRY002", # create your own exception. skip
@@ -1,5 +1,6 @@
1
1
  from ._is_enum import is_string_enum_class as is_string_enum_class
2
2
  from .argument_parser import CachedParser as CachedParser
3
+ from .argument_parser import ParserBase as ParserBase
3
4
  from .argument_parser import ParserError as ParserError
4
5
  from .argument_parser import ParserExtraFieldsError as ParserExtraFieldsError
5
6
  from .argument_parser import ParserFunction as ParserFunction
@@ -4,6 +4,7 @@ import dataclasses
4
4
  import math
5
5
  import types
6
6
  import typing
7
+ from abc import ABC, abstractmethod
7
8
  from collections import defaultdict
8
9
  from datetime import date, datetime
9
10
  from decimal import Decimal
@@ -365,7 +366,7 @@ def _build_parser_inner[T](
365
366
  context,
366
367
  )
367
368
 
368
- raise ValueError(f"Unhandled type {parsed_type}")
369
+ raise ValueError(f"Unhandled type {parsed_type}/{origin}")
369
370
 
370
371
 
371
372
  def _build_parser_dataclass[T](
@@ -501,17 +502,7 @@ def build_parser[T](
501
502
  return built_parser
502
503
 
503
504
 
504
- class CachedParser[T]:
505
- def __init__(
506
- self,
507
- args: type[T],
508
- strict_property_parsing: bool = False,
509
- ):
510
- self.arguments = args
511
- self.parser_api: ParserFunction[T] | None = None
512
- self.parser_storage: ParserFunction[T] | None = None
513
- self.strict_property_parsing = strict_property_parsing
514
-
505
+ class ParserBase[T](ABC):
515
506
  def parse_from_encoding(
516
507
  self,
517
508
  args: typing.Any,
@@ -526,6 +517,33 @@ class CachedParser[T]:
526
517
  case _:
527
518
  typing.assert_never(source_encoding)
528
519
 
520
+ # IMPROVE: Args would be better typed as "object"
521
+ @abstractmethod
522
+ def parse_storage(self, args: typing.Any) -> T: ...
523
+
524
+ @abstractmethod
525
+ def parse_api(self, args: typing.Any) -> T: ...
526
+
527
+ def parse_yaml_file(self, path: str) -> T:
528
+ with open(path, encoding="utf-8") as data_in:
529
+ return self.parse_storage(yaml.safe_load(data_in))
530
+
531
+ def parse_yaml_resource(self, package: resources.Package, resource: str) -> T:
532
+ with resources.open_text(package, resource) as fp:
533
+ return self.parse_storage(yaml.safe_load(fp))
534
+
535
+
536
+ class CachedParser[T](ParserBase[T]):
537
+ def __init__(
538
+ self,
539
+ args: type[T],
540
+ strict_property_parsing: bool = False,
541
+ ):
542
+ self.arguments = args
543
+ self.parser_api: ParserFunction[T] | None = None
544
+ self.parser_storage: ParserFunction[T] | None = None
545
+ self.strict_property_parsing = strict_property_parsing
546
+
529
547
  def parse_api(self, args: typing.Any) -> T:
530
548
  """
531
549
  Parses data coming from an API/Endpoint
@@ -557,11 +575,3 @@ class CachedParser[T]:
557
575
  )
558
576
  assert self.parser_storage is not None
559
577
  return self.parser_storage(args)
560
-
561
- def parse_yaml_file(self, path: str) -> T:
562
- with open(path, encoding="utf-8") as data_in:
563
- return self.parse_storage(yaml.safe_load(data_in))
564
-
565
- def parse_yaml_resource(self, package: resources.Package, resource: str) -> T:
566
- with resources.open_text(package, resource) as fp:
567
- return self.parse_storage(yaml.safe_load(fp))
@@ -7,7 +7,7 @@ from typing import Any, TypeVar, cast
7
7
 
8
8
  from .annotation import SerialBase, SerialInspector
9
9
 
10
- _ClassT = TypeVar("_ClassT")
10
+ ClassT = TypeVar("ClassT")
11
11
 
12
12
 
13
13
  @dataclasses.dataclass(kw_only=True, frozen=True, eq=True)
@@ -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,7 +31,8 @@ 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,
33
- ) -> Callable[[_ClassT], _ClassT]:
34
+ explicit_defaults: set[str] | None = None,
35
+ ) -> Callable[[ClassT], ClassT]:
34
36
  """
35
37
  An additional decorator to a dataclass that specifies serialization options.
36
38
 
@@ -52,9 +54,12 @@ 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
- def decorate(orig_class: _ClassT) -> _ClassT:
62
+ def decorate(orig_class: ClassT) -> ClassT:
58
63
  cast(Any, orig_class).__unc_serial_data = _SerialClassData(
59
64
  unconverted_keys=unconverted_keys or set(),
60
65
  unconverted_values=unconverted_values or set(),
@@ -63,16 +68,17 @@ 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
 
69
75
  return decorate
70
76
 
71
77
 
72
- class SerialClassDataInspector(SerialInspector[_ClassT]):
78
+ class SerialClassDataInspector(SerialInspector[ClassT]):
73
79
  def __init__(
74
80
  self,
75
- parsed_type: type[_ClassT],
81
+ parsed_type: type[ClassT],
76
82
  current: _SerialClassData,
77
83
  ) -> None:
78
84
  super().__init__(parsed_type, current)
@@ -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,13 +124,15 @@ 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
 
121
132
 
122
- def get_serial_class_data[_ClassT](
123
- type_class: type[_ClassT],
124
- ) -> SerialClassDataInspector[_ClassT]:
133
+ def get_serial_class_data[ClassT](
134
+ type_class: type[ClassT],
135
+ ) -> SerialClassDataInspector[ClassT]:
125
136
  return SerialClassDataInspector(
126
137
  type_class, get_merged_serial_class_data(type_class) or EMPTY_SERIAL_CLASS_DATA
127
138
  )
@@ -135,12 +146,12 @@ class _SerialStringEnumData:
135
146
 
136
147
  def serial_string_enum(
137
148
  *, labels: dict[str, str] | None = None, deprecated: set[str] | None = None
138
- ) -> Callable[[_ClassT], _ClassT]:
149
+ ) -> Callable[[ClassT], ClassT]:
139
150
  """
140
151
  A decorator for enums to provide serialization data, including labels.
141
152
  """
142
153
 
143
- def decorate(orig_class: _ClassT) -> _ClassT:
154
+ def decorate(orig_class: ClassT) -> ClassT:
144
155
  cast(Any, orig_class).__unc_serial_string_enum_data = _SerialStringEnumData(
145
156
  labels=labels or {}, deprecated=deprecated or set()
146
157
  )
@@ -26,7 +26,6 @@ class StabilityLevel(StrEnum):
26
26
  """
27
27
 
28
28
  draft = "draft"
29
- alpha = "alpha"
30
29
  beta = "beta"
31
30
  stable = "stable"
32
31
 
@@ -63,6 +62,7 @@ class SpecProperty:
63
62
  # Holds extra information that will be emitted along with type_info. The builder knows nothing
64
63
  # about the contents of this information.
65
64
  ext_info: Any = None
65
+ explicit_default: bool = False
66
66
 
67
67
 
68
68
  class NameCase(StrEnum):
@@ -390,6 +390,7 @@ class SpecTypeDefn(SpecType):
390
390
  ptype = builder.parse_type(self.namespace, data_type, scope=self)
391
391
 
392
392
  default_spec = data.get("default", MISSING)
393
+ explicit_default = default_spec != MISSING
393
394
  if default_spec == MISSING:
394
395
  has_default = False
395
396
  default = None
@@ -420,6 +421,7 @@ class SpecTypeDefn(SpecType):
420
421
  parse_require=parse_require,
421
422
  desc=data.get("desc", None),
422
423
  ext_info=ext_info,
424
+ explicit_default=explicit_default,
423
425
  )
424
426
  finally:
425
427
  builder.pop_where()
@@ -891,7 +893,6 @@ class SpecEndpoint:
891
893
  method: RouteMethod
892
894
  data_loader: bool
893
895
  is_sdk: EndpointEmitType
894
- is_beta: bool
895
896
  stability_level: StabilityLevel | None
896
897
  # Don't emit TypeScript endpoint code
897
898
  suppress_ts: bool
@@ -920,7 +921,6 @@ class SpecEndpoint:
920
921
  "path",
921
922
  "data_loader",
922
923
  "is_sdk",
923
- "is_beta",
924
924
  "stability_level",
925
925
  "async_batch_path",
926
926
  "function",
@@ -966,10 +966,6 @@ class SpecEndpoint:
966
966
  assert account_type is None or isinstance(account_type, str)
967
967
  self.account_type = account_type
968
968
 
969
- is_beta = data.get("is_beta", False)
970
- assert isinstance(is_beta, bool)
971
- self.is_beta = is_beta
972
-
973
969
  stability_level_raw = data.get("stability_level")
974
970
  assert stability_level_raw is None or isinstance(stability_level_raw, str)
975
971
  self.stability_level = (
@@ -67,6 +67,7 @@ class PythonConfig(BaseLanguageConfig):
67
67
  emit_client_class: bool = False # emit the base class for the api client
68
68
  all_named_type_exports: bool = False # emit __all__ for all named type exports
69
69
  sdk_endpoints_only: bool = False # only emit is_sdk endpoints
70
+ type_info_output: str | None = None # folder for generated type info files
70
71
 
71
72
  def __post_init__(self: Self) -> None:
72
73
  self.routes_output = _parse_string_lookup(
@@ -78,6 +79,9 @@ class PythonConfig(BaseLanguageConfig):
78
79
  else None
79
80
  )
80
81
 
82
+ if self.type_info_output is not None:
83
+ self.type_info_output = os.path.abspath(self.type_info_output)
84
+
81
85
 
82
86
  @dataclass(kw_only=True)
83
87
  class OpenAPIConfig(BaseLanguageConfig):
@@ -103,7 +107,7 @@ class Config:
103
107
  open_api: OpenAPIConfig | None
104
108
 
105
109
 
106
- def _parse_language[_T](config_class: type[_T], raw_value: ConfigValueType) -> _T:
110
+ def _parse_language[T](config_class: type[T], raw_value: ConfigValueType) -> T:
107
111
  assert isinstance(raw_value, dict), "expecting language config to have key/values."
108
112
  return config_class(**raw_value)
109
113
 
@@ -7,7 +7,7 @@ WORK-IN-PROGRESS, DON'T USE!
7
7
  import dataclasses
8
8
  import json
9
9
  import re
10
- from typing import Collection, cast
10
+ from typing import Collection, assert_never, cast
11
11
 
12
12
  from pkgs.serialization import yaml
13
13
  from pkgs.serialization_util import serialize_for_api
@@ -126,7 +126,11 @@ def emit_open_api(builder: builder.SpecBuilder, *, config: OpenAPIConfig) -> Non
126
126
  for namespace in sorted(builder.namespaces.values(), key=lambda ns: ns.name):
127
127
  ctx = EmitOpenAPIContext(namespace=namespace)
128
128
 
129
- if ctx.namespace.endpoint is not None and ctx.namespace.endpoint.is_beta:
129
+ if (
130
+ ctx.namespace.endpoint is not None
131
+ and ctx.namespace.endpoint.stability_level
132
+ == EmitOpenAPIStabilityLevel.draft
133
+ ):
130
134
  continue
131
135
 
132
136
  if ctx.namespace.name == "base":
@@ -252,18 +256,26 @@ def _emit_endpoint_parameters(
252
256
  } | _emit_endpoint_parameter_examples(examples)
253
257
 
254
258
 
255
- def _emit_is_beta(is_beta: bool) -> DictApiSchema:
256
- if is_beta:
257
- return {"x-beta": True}
258
- return {}
259
-
260
-
261
259
  def _emit_stability_level(
262
260
  stability_level: EmitOpenAPIStabilityLevel | None,
263
261
  ) -> DictApiSchema:
264
- if stability_level is not None:
265
- return {"x-stability-level": str(stability_level)}
266
- return {}
262
+ stability_info: dict[str, ApiSchema] = {}
263
+ resolved_stability_level = (
264
+ stability_level
265
+ if stability_level is not None
266
+ else EmitOpenAPIStabilityLevel.stable
267
+ )
268
+ stability_info["x-stability-level"] = str(resolved_stability_level)
269
+ match resolved_stability_level:
270
+ case EmitOpenAPIStabilityLevel.draft:
271
+ stability_info["x-beta"] = True
272
+ case EmitOpenAPIStabilityLevel.beta:
273
+ stability_info["x-badges"] = [{"name": "Beta", "color": "DarkOrange"}]
274
+ case EmitOpenAPIStabilityLevel.stable:
275
+ pass
276
+ case _:
277
+ assert_never(stability_level)
278
+ return stability_info
267
279
 
268
280
 
269
281
  def _emit_endpoint_request_body(
@@ -360,7 +372,6 @@ def _emit_namespace(
360
372
  "summary": endpoint.summary,
361
373
  }
362
374
  | _emit_endpoint_description(endpoint.description, ctx.endpoint.guides)
363
- | _emit_is_beta(endpoint.is_beta)
364
375
  | _emit_stability_level(endpoint.stability_level)
365
376
  | _emit_endpoint_parameters(endpoint, argument_type, ctx.endpoint.examples)
366
377
  | _emit_endpoint_request_body(
@@ -579,7 +590,6 @@ def _emit_endpoint(
579
590
  tags=[tag_name],
580
591
  summary=f"{'/'.join(namespace.path[path_cutoff:])}",
581
592
  description=description,
582
- is_beta=namespace.endpoint.is_beta,
583
593
  stability_level=namespace.endpoint.stability_level,
584
594
  examples=[
585
595
  EmitOpenAPIEndpointExample(
@@ -82,7 +82,6 @@ class EmitOpenAPIEndpoint:
82
82
  tags: list[str]
83
83
  summary: str
84
84
  description: str
85
- is_beta: bool
86
85
  stability_level: EmitOpenAPIStabilityLevel | None
87
86
  examples: list[EmitOpenAPIEndpointExample]
88
87
  guides: list[EmitOpenAPIGuide]
@@ -8,6 +8,7 @@ from . import builder, util
8
8
  from .builder import EndpointEmitType, EndpointSpecificPath
9
9
  from .config import PythonConfig
10
10
  from .cross_output_links import get_path_links
11
+ from .emit_open_api_util import EmitOpenAPIStabilityLevel
11
12
 
12
13
  INDENT = " "
13
14
  LINE_BREAK = "\n"
@@ -601,7 +602,10 @@ def _emit_endpoint_invocation_function(
601
602
  endpoint = namespace.endpoint
602
603
  if endpoint is None:
603
604
  return
604
- if endpoint.is_sdk != EndpointEmitType.EMIT_ENDPOINT or endpoint.is_beta:
605
+ if (
606
+ endpoint.is_sdk != EndpointEmitType.EMIT_ENDPOINT
607
+ or endpoint.stability_level == EmitOpenAPIStabilityLevel.draft
608
+ ):
605
609
  return
606
610
 
607
611
  ctx.out.write("\n")
@@ -693,6 +697,7 @@ class EmittedPropertiesMetadata:
693
697
  unconverted_values: set[str]
694
698
  to_string_values: set[str]
695
699
  parse_require: set[str]
700
+ explicit_defaults: set[str]
696
701
 
697
702
 
698
703
  def _emit_type_properties(
@@ -724,6 +729,7 @@ def _emit_properties(
724
729
  unconverted_values: set[str] = set()
725
730
  to_string_values: set[str] = set()
726
731
  parse_require: set[str] = set()
732
+ explicit_defaults: set[str] = set()
727
733
 
728
734
  if len(properties) > 0:
729
735
 
@@ -744,6 +750,9 @@ def _emit_properties(
744
750
  if prop.parse_require:
745
751
  parse_require.add(py_name)
746
752
 
753
+ if prop.explicit_default:
754
+ explicit_defaults.add(py_name)
755
+
747
756
  ref_type = refer_to(ctx, stype)
748
757
  default = None
749
758
  if prop.extant == builder.PropertyExtant.missing:
@@ -787,6 +796,7 @@ def _emit_properties(
787
796
  unconverted_values=unconverted_values,
788
797
  to_string_values=to_string_values,
789
798
  parse_require=parse_require,
799
+ explicit_defaults=explicit_defaults,
790
800
  )
791
801
 
792
802
 
@@ -877,6 +887,7 @@ def _emit_type(ctx: Context, stype: builder.SpecType) -> None:
877
887
  unconverted_values = emitted_properties_metadata.unconverted_values
878
888
  to_string_values = emitted_properties_metadata.to_string_values
879
889
  parse_require = emitted_properties_metadata.parse_require
890
+ explicit_defaults = emitted_properties_metadata.explicit_defaults
880
891
 
881
892
  _emit_generics(ctx, generics)
882
893
 
@@ -898,6 +909,7 @@ def _emit_type(ctx: Context, stype: builder.SpecType) -> None:
898
909
  write_values("unconverted_values", unconverted_values)
899
910
  write_values("to_string_values", to_string_values)
900
911
  write_values("parse_require", parse_require)
912
+ write_values("explicit_defaults", explicit_defaults)
901
913
 
902
914
  ctx.out.write(")\n")
903
915
 
@@ -9,7 +9,7 @@ import sys
9
9
 
10
10
  from ..config import parse_yaml_config
11
11
  from ..load_types import load_types
12
- from .emit_type_info import emit_type_info
12
+ from .emit_type_info import emit_type_info, emit_type_info_python
13
13
 
14
14
 
15
15
  def main() -> bool:
@@ -26,6 +26,8 @@ def main() -> bool:
26
26
 
27
27
  assert config.typescript is not None
28
28
  emit_type_info(builder, config.typescript.type_info_output)
29
+ if config.python.type_info_output is not None:
30
+ emit_type_info_python(builder, config.python.type_info_output)
29
31
 
30
32
  return True
31
33
 
@@ -3,15 +3,15 @@ import dataclasses
3
3
  import decimal
4
4
  import io
5
5
  import json
6
+ from enum import Enum
6
7
  from typing import Any, cast
7
8
 
9
+ import yaml
10
+
8
11
  from main.base.types import data_t, type_info_t
9
12
  from main.base.types.base_t import PureJsonValue
10
13
  from pkgs.argument_parser import CachedParser
11
- from pkgs.serialization_util import (
12
- serialize_for_api,
13
- serialize_for_storage,
14
- )
14
+ from pkgs.serialization_util import serialize_for_api, serialize_for_storage
15
15
 
16
16
  from .. import builder, util
17
17
  from ..emit_typescript_util import MODIFY_NOTICE, ts_name
@@ -95,6 +95,35 @@ def emit_type_info(build: builder.SpecBuilder, output: str) -> None:
95
95
  util.rewrite_file(f"{output}/type_map.ts", type_map_out.getvalue())
96
96
 
97
97
 
98
+ def _convert_value_for_yaml_dump(value: Any) -> Any:
99
+ if isinstance(value, Enum):
100
+ return value.value
101
+ elif isinstance(value, list):
102
+ return [_convert_value_for_yaml_dump(item) for item in value]
103
+ elif isinstance(value, dict):
104
+ return {k: _convert_value_for_yaml_dump(v) for k, v in value.items()}
105
+ elif isinstance(value, decimal.Decimal):
106
+ return str(value)
107
+ else:
108
+ return value
109
+
110
+
111
+ def asdict_for_yaml_dump(dataclass_instance: Any) -> Any:
112
+ return {
113
+ k: _convert_value_for_yaml_dump(v)
114
+ for k, v in dataclasses.asdict(dataclass_instance).items()
115
+ }
116
+
117
+
118
+ def emit_type_info_python(build: builder.SpecBuilder, output: str) -> None:
119
+ type_map = _build_map_all(build)
120
+
121
+ stripped = _dict_null_strip(asdict_for_yaml_dump(type_map))
122
+
123
+ yaml_content = yaml.dump(stripped, default_flow_style=False, sort_keys=True)
124
+ util.rewrite_file(f"{output}/type_map.yaml", yaml_content)
125
+
126
+
98
127
  @dataclasses.dataclass
99
128
  class MapProperty:
100
129
  api_name: str
@@ -106,7 +135,7 @@ class MapProperty:
106
135
  desc: str | None
107
136
  # We don't have typing on defaults yet, relying on emitters to check it. Limit
108
137
  # use of this field, as it'll necessarily change when adding type info
109
- default: object
138
+ default: PureJsonValue
110
139
 
111
140
 
112
141
  @dataclasses.dataclass
@@ -71,7 +71,7 @@ dependencies = [
71
71
  "grpcio == 1.67.1",
72
72
  "protobuf >= 4.21.1",
73
73
  "azure-storage-blob == 12.*",
74
- "boto3-stubs[essential,ses]==1.36.4"
74
+ "boto3-stubs[essential,ses]==1.*"
75
75
  ]
76
76
  dynamic = ["version"]
77
77