UncountablePythonSDK 0.0.142.dev0__tar.gz → 0.0.143__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (378) hide show
  1. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/.github/workflows/publish.yml +1 -3
  2. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/PKG-INFO +2 -2
  3. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/UncountablePythonSDK.egg-info/PKG-INFO +2 -2
  4. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/UncountablePythonSDK.egg-info/SOURCES.txt +6 -0
  5. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/UncountablePythonSDK.egg-info/requires.txt +1 -1
  6. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/examples/integration-server/jobs/materials_auto/example_http.py +1 -1
  7. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/examples/integration-server/jobs/materials_auto/example_runsheet_wh.py +8 -0
  8. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/pkgs/argument_parser/argument_parser.py +60 -18
  9. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/pkgs/type_spec/builder.py +8 -1
  10. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/pkgs/type_spec/emit_python.py +8 -11
  11. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/pkgs/type_spec/emit_typescript_util.py +4 -1
  12. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/pkgs/type_spec/parts/base.ts.prepart +3 -0
  13. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/pyproject.toml +1 -2
  14. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/core/client.py +5 -3
  15. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/core/file_upload.py +5 -1
  16. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/integration/construct_client.py +1 -0
  17. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/integration/queue_runner/worker.py +6 -0
  18. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/integration/scan_profiles.py +2 -0
  19. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/integration/telemetry.py +29 -5
  20. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/__init__.py +6 -0
  21. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/api/entity/list_aggregate.py +0 -1
  22. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/api/runsheet/export_default_runsheet.py +2 -0
  23. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/client_base.py +30 -2
  24. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/entity_t.py +51 -5
  25. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/integration_server_t.py +1 -0
  26. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/job_definition_t.py +2 -0
  27. uncountablepythonsdk-0.0.143/uncountable/types/runsheet.py +21 -0
  28. uncountablepythonsdk-0.0.143/uncountable/types/runsheet_format.py +13 -0
  29. uncountablepythonsdk-0.0.143/uncountable/types/runsheet_format_t.py +92 -0
  30. uncountablepythonsdk-0.0.143/uncountable/types/runsheet_t.py +218 -0
  31. uncountablepythonsdk-0.0.143/uncountable/types/specs.py +7 -0
  32. uncountablepythonsdk-0.0.143/uncountable/types/specs_t.py +22 -0
  33. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/.github/workflows/documentation.yml +0 -0
  34. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/.gitignore +0 -0
  35. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/.python-version +0 -0
  36. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/README.md +0 -0
  37. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/UncountablePythonSDK.egg-info/dependency_links.txt +0 -0
  38. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/UncountablePythonSDK.egg-info/top_level.txt +0 -0
  39. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/docs/.gitignore +0 -0
  40. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/docs/conf.py +0 -0
  41. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/docs/index.md +0 -0
  42. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/docs/integration_examples/create_ingredient.md +0 -0
  43. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/docs/integration_examples/create_output.md +0 -0
  44. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/docs/integration_examples/index.md +0 -0
  45. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/docs/justfile +0 -0
  46. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/docs/requirements.txt +0 -0
  47. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/docs/static/favicons/android-chrome-192x192.png +0 -0
  48. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/docs/static/favicons/android-chrome-512x512.png +0 -0
  49. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/docs/static/favicons/apple-touch-icon.png +0 -0
  50. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/docs/static/favicons/browserconfig.xml +0 -0
  51. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/docs/static/favicons/favicon-16x16.png +0 -0
  52. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/docs/static/favicons/favicon-32x32.png +0 -0
  53. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/docs/static/favicons/manifest.json +0 -0
  54. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/docs/static/favicons/mstile-150x150.png +0 -0
  55. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/docs/static/favicons/safari-pinned-tab.svg +0 -0
  56. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/docs/static/logo_blue.png +0 -0
  57. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/examples/async_batch.py +0 -0
  58. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/examples/basic_auth.py +0 -0
  59. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/examples/create_entity.py +0 -0
  60. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/examples/create_ingredient_sdk.py +0 -0
  61. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/examples/download_files.py +0 -0
  62. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/examples/edit_recipe_inputs.py +0 -0
  63. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/examples/integration-server/jobs/materials_auto/concurrent_cron.py +0 -0
  64. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/examples/integration-server/jobs/materials_auto/example_cron.py +0 -0
  65. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/examples/integration-server/jobs/materials_auto/example_instrument.py +0 -0
  66. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/examples/integration-server/jobs/materials_auto/example_parse.py +0 -0
  67. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/examples/integration-server/jobs/materials_auto/example_predictions.py +0 -0
  68. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/examples/integration-server/jobs/materials_auto/example_wh.py +0 -0
  69. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/examples/integration-server/jobs/materials_auto/profile.yaml +0 -0
  70. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/examples/integration-server/pyproject.toml +0 -0
  71. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/examples/invoke_uploader.py +0 -0
  72. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/examples/oauth.py +0 -0
  73. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/examples/set_recipe_metadata_file.py +0 -0
  74. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/examples/set_recipe_output_file_sdk.py +0 -0
  75. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/examples/upload_files.py +0 -0
  76. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/pkgs/__init__.py +0 -0
  77. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/pkgs/argument_parser/__init__.py +0 -0
  78. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/pkgs/argument_parser/_is_enum.py +0 -0
  79. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/pkgs/argument_parser/_is_namedtuple.py +0 -0
  80. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/pkgs/argument_parser/case_convert.py +0 -0
  81. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/pkgs/filesystem_utils/__init__.py +0 -0
  82. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/pkgs/filesystem_utils/_blob_session.py +0 -0
  83. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/pkgs/filesystem_utils/_gdrive_session.py +0 -0
  84. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/pkgs/filesystem_utils/_local_session.py +0 -0
  85. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/pkgs/filesystem_utils/_s3_session.py +0 -0
  86. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/pkgs/filesystem_utils/_sftp_session.py +0 -0
  87. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/pkgs/filesystem_utils/file_type_utils.py +0 -0
  88. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/pkgs/filesystem_utils/filesystem_session.py +0 -0
  89. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/pkgs/py.typed +0 -0
  90. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/pkgs/serialization/__init__.py +0 -0
  91. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/pkgs/serialization/annotation.py +0 -0
  92. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/pkgs/serialization/missing_sentry.py +0 -0
  93. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/pkgs/serialization/opaque_key.py +0 -0
  94. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/pkgs/serialization/serial_alias.py +0 -0
  95. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/pkgs/serialization/serial_class.py +0 -0
  96. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/pkgs/serialization/serial_generic.py +0 -0
  97. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/pkgs/serialization/serial_union.py +0 -0
  98. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/pkgs/serialization/yaml.py +0 -0
  99. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/pkgs/serialization_util/__init__.py +0 -0
  100. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/pkgs/serialization_util/_get_type_for_serialization.py +0 -0
  101. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/pkgs/serialization_util/convert_to_snakecase.py +0 -0
  102. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/pkgs/serialization_util/dataclasses.py +0 -0
  103. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/pkgs/serialization_util/serialization_helpers.py +0 -0
  104. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/pkgs/strenum_compat/__init__.py +0 -0
  105. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/pkgs/strenum_compat/strenum_compat.py +0 -0
  106. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/pkgs/type_spec/__init__.py +0 -0
  107. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/pkgs/type_spec/__main__.py +0 -0
  108. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/pkgs/type_spec/actions_registry/__init__.py +0 -0
  109. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/pkgs/type_spec/actions_registry/__main__.py +0 -0
  110. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/pkgs/type_spec/actions_registry/emit_typescript.py +0 -0
  111. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/pkgs/type_spec/builder_types.py +0 -0
  112. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/pkgs/type_spec/config.py +0 -0
  113. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/pkgs/type_spec/cross_output_links.py +0 -0
  114. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/pkgs/type_spec/emit_io_ts.py +0 -0
  115. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/pkgs/type_spec/emit_open_api.py +0 -0
  116. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/pkgs/type_spec/emit_open_api_util.py +0 -0
  117. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/pkgs/type_spec/emit_typescript.py +0 -0
  118. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/pkgs/type_spec/load_types.py +0 -0
  119. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/pkgs/type_spec/non_discriminated_union_exceptions.py +0 -0
  120. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/pkgs/type_spec/open_api_util.py +0 -0
  121. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/pkgs/type_spec/parts/base.py.prepart +0 -0
  122. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/pkgs/type_spec/test.py +0 -0
  123. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/pkgs/type_spec/type_info/__main__.py +0 -0
  124. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/pkgs/type_spec/type_info/emit_type_info.py +0 -0
  125. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/pkgs/type_spec/ui_entry_actions/__init__.py +0 -0
  126. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/pkgs/type_spec/ui_entry_actions/generate_ui_entry_actions.py +0 -0
  127. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/pkgs/type_spec/util.py +0 -0
  128. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/pkgs/type_spec/value_spec/__init__.py +0 -0
  129. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/pkgs/type_spec/value_spec/__main__.py +0 -0
  130. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/pkgs/type_spec/value_spec/convert_type.py +0 -0
  131. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/pkgs/type_spec/value_spec/emit_python.py +0 -0
  132. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/pkgs/type_spec/value_spec/types.py +0 -0
  133. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/setup.cfg +0 -0
  134. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/__init__.py +0 -0
  135. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/core/__init__.py +0 -0
  136. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/core/async_batch.py +0 -0
  137. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/core/environment.py +0 -0
  138. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/core/types.py +0 -0
  139. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/integration/__init__.py +0 -0
  140. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/integration/cli.py +0 -0
  141. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/integration/cron.py +0 -0
  142. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/integration/db/__init__.py +0 -0
  143. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/integration/db/connect.py +0 -0
  144. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/integration/db/session.py +0 -0
  145. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/integration/entrypoint.py +0 -0
  146. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/integration/executors/__init__.py +0 -0
  147. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/integration/executors/executors.py +0 -0
  148. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/integration/executors/generic_upload_executor.py +0 -0
  149. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/integration/executors/script_executor.py +0 -0
  150. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/integration/http_server/__init__.py +0 -0
  151. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/integration/http_server/types.py +0 -0
  152. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/integration/job.py +0 -0
  153. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/integration/queue_runner/__init__.py +0 -0
  154. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/integration/queue_runner/command_server/__init__.py +0 -0
  155. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/integration/queue_runner/command_server/command_client.py +0 -0
  156. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/integration/queue_runner/command_server/command_server.py +0 -0
  157. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/integration/queue_runner/command_server/constants.py +0 -0
  158. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/integration/queue_runner/command_server/protocol/__init__.py +0 -0
  159. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/integration/queue_runner/command_server/protocol/command_server.proto +0 -0
  160. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/integration/queue_runner/command_server/protocol/command_server_pb2.py +0 -0
  161. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/integration/queue_runner/command_server/protocol/command_server_pb2.pyi +0 -0
  162. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/integration/queue_runner/command_server/protocol/command_server_pb2_grpc.py +0 -0
  163. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/integration/queue_runner/command_server/types.py +0 -0
  164. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/integration/queue_runner/datastore/__init__.py +0 -0
  165. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/integration/queue_runner/datastore/datastore_sqlite.py +0 -0
  166. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/integration/queue_runner/datastore/interface.py +0 -0
  167. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/integration/queue_runner/datastore/model.py +0 -0
  168. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/integration/queue_runner/job_scheduler.py +0 -0
  169. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/integration/queue_runner/queue_runner.py +0 -0
  170. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/integration/queue_runner/types.py +0 -0
  171. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/integration/scheduler.py +0 -0
  172. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/integration/secret_retrieval/__init__.py +0 -0
  173. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/integration/secret_retrieval/retrieve_secret.py +0 -0
  174. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/integration/server.py +0 -0
  175. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/integration/webhook_server/entrypoint.py +0 -0
  176. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/py.typed +0 -0
  177. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/api/__init__.py +0 -0
  178. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/api/batch/__init__.py +0 -0
  179. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/api/batch/execute_batch.py +0 -0
  180. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/api/batch/execute_batch_load_async.py +0 -0
  181. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/api/chemical/__init__.py +0 -0
  182. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/api/chemical/convert_chemical_formats.py +0 -0
  183. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/api/condition_parameters/__init__.py +0 -0
  184. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/api/condition_parameters/upsert_condition_match.py +0 -0
  185. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/api/entity/__init__.py +0 -0
  186. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/api/entity/create_entities.py +0 -0
  187. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/api/entity/create_entity.py +0 -0
  188. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/api/entity/create_or_update_entity.py +0 -0
  189. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/api/entity/export_entities.py +0 -0
  190. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/api/entity/get_entities_data.py +0 -0
  191. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/api/entity/grant_entity_permissions.py +0 -0
  192. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/api/entity/list_entities.py +0 -0
  193. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/api/entity/lock_entity.py +0 -0
  194. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/api/entity/lookup_entity.py +0 -0
  195. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/api/entity/resolve_entity_ids.py +0 -0
  196. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/api/entity/set_barcode.py +0 -0
  197. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/api/entity/set_entity_field_values.py +0 -0
  198. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/api/entity/set_values.py +0 -0
  199. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/api/entity/transition_entity_phase.py +0 -0
  200. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/api/entity/unlock_entity.py +0 -0
  201. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/api/equipment/__init__.py +0 -0
  202. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/api/equipment/associate_equipment_input.py +0 -0
  203. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/api/field_options/__init__.py +0 -0
  204. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/api/field_options/upsert_field_options.py +0 -0
  205. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/api/files/__init__.py +0 -0
  206. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/api/files/download_file.py +0 -0
  207. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/api/id_source/__init__.py +0 -0
  208. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/api/id_source/list_id_source.py +0 -0
  209. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/api/id_source/match_id_source.py +0 -0
  210. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/api/input_groups/__init__.py +0 -0
  211. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/api/input_groups/get_input_group_names.py +0 -0
  212. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/api/inputs/__init__.py +0 -0
  213. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/api/inputs/create_inputs.py +0 -0
  214. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/api/inputs/get_input_data.py +0 -0
  215. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/api/inputs/get_input_names.py +0 -0
  216. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/api/inputs/get_inputs_data.py +0 -0
  217. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/api/inputs/set_input_attribute_values.py +0 -0
  218. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/api/inputs/set_input_category.py +0 -0
  219. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/api/inputs/set_input_subcategories.py +0 -0
  220. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/api/inputs/set_intermediate_type.py +0 -0
  221. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/api/integrations/__init__.py +0 -0
  222. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/api/integrations/publish_realtime_data.py +0 -0
  223. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/api/integrations/push_notification.py +0 -0
  224. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/api/integrations/register_sockets_token.py +0 -0
  225. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/api/listing/__init__.py +0 -0
  226. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/api/listing/fetch_listing.py +0 -0
  227. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/api/material_families/__init__.py +0 -0
  228. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/api/material_families/update_entity_material_families.py +0 -0
  229. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/api/notebooks/__init__.py +0 -0
  230. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/api/notebooks/add_notebook_content.py +0 -0
  231. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/api/outputs/__init__.py +0 -0
  232. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/api/outputs/get_output_data.py +0 -0
  233. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/api/outputs/get_output_names.py +0 -0
  234. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/api/outputs/get_output_organization.py +0 -0
  235. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/api/outputs/resolve_output_conditions.py +0 -0
  236. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/api/permissions/__init__.py +0 -0
  237. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/api/permissions/set_core_permissions.py +0 -0
  238. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/api/project/__init__.py +0 -0
  239. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/api/project/get_projects.py +0 -0
  240. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/api/project/get_projects_data.py +0 -0
  241. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/api/recipe_links/__init__.py +0 -0
  242. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/api/recipe_links/create_recipe_link.py +0 -0
  243. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/api/recipe_links/remove_recipe_link.py +0 -0
  244. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/api/recipe_metadata/__init__.py +0 -0
  245. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/api/recipe_metadata/get_recipe_metadata_data.py +0 -0
  246. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/api/recipes/__init__.py +0 -0
  247. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/api/recipes/add_recipe_to_project.py +0 -0
  248. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/api/recipes/add_time_series_data.py +0 -0
  249. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/api/recipes/archive_recipes.py +0 -0
  250. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/api/recipes/associate_recipe_as_input.py +0 -0
  251. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/api/recipes/associate_recipe_as_lot.py +0 -0
  252. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/api/recipes/clear_recipe_outputs.py +0 -0
  253. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/api/recipes/create_mix_order.py +0 -0
  254. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/api/recipes/create_recipe.py +0 -0
  255. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/api/recipes/create_recipes.py +0 -0
  256. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/api/recipes/disassociate_recipe_as_input.py +0 -0
  257. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/api/recipes/edit_recipe_inputs.py +0 -0
  258. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/api/recipes/get_column_calculation_values.py +0 -0
  259. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/api/recipes/get_curve.py +0 -0
  260. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/api/recipes/get_recipe_calculations.py +0 -0
  261. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/api/recipes/get_recipe_links.py +0 -0
  262. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/api/recipes/get_recipe_names.py +0 -0
  263. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/api/recipes/get_recipe_output_metadata.py +0 -0
  264. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/api/recipes/get_recipes_data.py +0 -0
  265. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/api/recipes/lock_recipes.py +0 -0
  266. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/api/recipes/remove_recipe_from_project.py +0 -0
  267. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/api/recipes/set_recipe_inputs.py +0 -0
  268. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/api/recipes/set_recipe_metadata.py +0 -0
  269. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/api/recipes/set_recipe_output_annotations.py +0 -0
  270. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/api/recipes/set_recipe_output_file.py +0 -0
  271. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/api/recipes/set_recipe_outputs.py +0 -0
  272. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/api/recipes/set_recipe_tags.py +0 -0
  273. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/api/recipes/set_recipe_total.py +0 -0
  274. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/api/recipes/unarchive_recipes.py +0 -0
  275. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/api/recipes/unlock_recipes.py +0 -0
  276. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/api/runsheet/__init__.py +0 -0
  277. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/api/runsheet/complete_async_upload.py +0 -0
  278. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/api/triggers/__init__.py +0 -0
  279. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/api/triggers/run_trigger.py +0 -0
  280. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/api/uploader/__init__.py +0 -0
  281. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/api/uploader/complete_async_parse.py +0 -0
  282. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/api/uploader/invoke_uploader.py +0 -0
  283. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/api/user/__init__.py +0 -0
  284. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/api/user/get_current_user_info.py +0 -0
  285. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/async_batch.py +0 -0
  286. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/async_batch_processor.py +0 -0
  287. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/async_batch_t.py +0 -0
  288. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/async_jobs.py +0 -0
  289. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/async_jobs_t.py +0 -0
  290. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/auth_retrieval.py +0 -0
  291. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/auth_retrieval_t.py +0 -0
  292. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/base.py +0 -0
  293. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/base_t.py +0 -0
  294. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/calculations.py +0 -0
  295. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/calculations_t.py +0 -0
  296. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/chemical_structure.py +0 -0
  297. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/chemical_structure_t.py +0 -0
  298. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/client_config.py +0 -0
  299. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/client_config_t.py +0 -0
  300. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/curves.py +0 -0
  301. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/curves_t.py +0 -0
  302. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/data.py +0 -0
  303. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/data_t.py +0 -0
  304. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/entity.py +0 -0
  305. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/experiment_groups.py +0 -0
  306. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/experiment_groups_t.py +0 -0
  307. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/exports.py +0 -0
  308. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/exports_t.py +0 -0
  309. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/field_values.py +0 -0
  310. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/field_values_t.py +0 -0
  311. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/fields.py +0 -0
  312. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/fields_t.py +0 -0
  313. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/generic_upload.py +0 -0
  314. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/generic_upload_t.py +0 -0
  315. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/id_source.py +0 -0
  316. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/id_source_t.py +0 -0
  317. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/identifier.py +0 -0
  318. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/identifier_t.py +0 -0
  319. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/input_attributes.py +0 -0
  320. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/input_attributes_t.py +0 -0
  321. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/inputs.py +0 -0
  322. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/inputs_t.py +0 -0
  323. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/integration_server.py +0 -0
  324. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/integration_session.py +0 -0
  325. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/integration_session_t.py +0 -0
  326. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/integrations.py +0 -0
  327. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/integrations_t.py +0 -0
  328. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/job_definition.py +0 -0
  329. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/listing.py +0 -0
  330. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/listing_t.py +0 -0
  331. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/notices.py +0 -0
  332. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/notices_t.py +0 -0
  333. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/notifications.py +0 -0
  334. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/notifications_t.py +0 -0
  335. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/outputs.py +0 -0
  336. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/outputs_t.py +0 -0
  337. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/overrides.py +0 -0
  338. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/overrides_t.py +0 -0
  339. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/permissions.py +0 -0
  340. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/permissions_t.py +0 -0
  341. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/phases.py +0 -0
  342. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/phases_t.py +0 -0
  343. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/post_base.py +0 -0
  344. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/post_base_t.py +0 -0
  345. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/queued_job.py +0 -0
  346. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/queued_job_t.py +0 -0
  347. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/recipe_identifiers.py +0 -0
  348. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/recipe_identifiers_t.py +0 -0
  349. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/recipe_inputs.py +0 -0
  350. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/recipe_inputs_t.py +0 -0
  351. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/recipe_links.py +0 -0
  352. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/recipe_links_t.py +0 -0
  353. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/recipe_metadata.py +0 -0
  354. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/recipe_metadata_t.py +0 -0
  355. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/recipe_output_metadata.py +0 -0
  356. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/recipe_output_metadata_t.py +0 -0
  357. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/recipe_tags.py +0 -0
  358. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/recipe_tags_t.py +0 -0
  359. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/recipe_workflow_steps.py +0 -0
  360. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/recipe_workflow_steps_t.py +0 -0
  361. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/recipes.py +0 -0
  362. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/recipes_t.py +0 -0
  363. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/response.py +0 -0
  364. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/response_t.py +0 -0
  365. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/secret_retrieval.py +0 -0
  366. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/secret_retrieval_t.py +0 -0
  367. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/sockets.py +0 -0
  368. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/sockets_t.py +0 -0
  369. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/units.py +0 -0
  370. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/units_t.py +0 -0
  371. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/uploader.py +0 -0
  372. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/uploader_t.py +0 -0
  373. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/users.py +0 -0
  374. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/users_t.py +0 -0
  375. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/webhook_job.py +0 -0
  376. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/webhook_job_t.py +0 -0
  377. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/workflows.py +0 -0
  378. {uncountablepythonsdk-0.0.142.dev0 → uncountablepythonsdk-0.0.143}/uncountable/types/workflows_t.py +0 -0
@@ -32,11 +32,9 @@ jobs:
32
32
  - name: Install build dependencies
33
33
  run: |
34
34
  uv pip install --upgrade build
35
- - name: Show changes
36
- run: |
37
- git status
38
35
  - name: Build distributions and wheels
39
36
  run: |
37
+ export SETUPTOOLS_SCM_PRETEND_VERSION_FOR_uncountablepythonsdk=$(git describe --tags --exact-match)
40
38
  python3 -m build
41
39
  - uses: actions/upload-artifact@65462800fd760344b1a7b4382951275a0abb4808 # v4
42
40
  with:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: UncountablePythonSDK
3
- Version: 0.0.142.dev0
3
+ Version: 0.0.143
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
@@ -30,7 +30,7 @@ Requires-Dist: pysftp==0.*
30
30
  Requires-Dist: opentelemetry-api==1.*
31
31
  Requires-Dist: opentelemetry-exporter-otlp-proto-common==1.*
32
32
  Requires-Dist: opentelemetry-exporter-otlp-proto-http==1.*
33
- Requires-Dist: opentelemetry-sdk==1.*
33
+ Requires-Dist: opentelemetry-sdk<1.39.0
34
34
  Requires-Dist: paramiko==3.*
35
35
  Requires-Dist: boto3==1.*
36
36
  Requires-Dist: flask==3.*
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: UncountablePythonSDK
3
- Version: 0.0.142.dev0
3
+ Version: 0.0.143
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
@@ -30,7 +30,7 @@ Requires-Dist: pysftp==0.*
30
30
  Requires-Dist: opentelemetry-api==1.*
31
31
  Requires-Dist: opentelemetry-exporter-otlp-proto-common==1.*
32
32
  Requires-Dist: opentelemetry-exporter-otlp-proto-http==1.*
33
- Requires-Dist: opentelemetry-sdk==1.*
33
+ Requires-Dist: opentelemetry-sdk<1.39.0
34
34
  Requires-Dist: paramiko==3.*
35
35
  Requires-Dist: boto3==1.*
36
36
  Requires-Dist: flask==3.*
@@ -244,10 +244,16 @@ uncountable/types/recipes.py
244
244
  uncountable/types/recipes_t.py
245
245
  uncountable/types/response.py
246
246
  uncountable/types/response_t.py
247
+ uncountable/types/runsheet.py
248
+ uncountable/types/runsheet_format.py
249
+ uncountable/types/runsheet_format_t.py
250
+ uncountable/types/runsheet_t.py
247
251
  uncountable/types/secret_retrieval.py
248
252
  uncountable/types/secret_retrieval_t.py
249
253
  uncountable/types/sockets.py
250
254
  uncountable/types/sockets_t.py
255
+ uncountable/types/specs.py
256
+ uncountable/types/specs_t.py
251
257
  uncountable/types/units.py
252
258
  uncountable/types/units_t.py
253
259
  uncountable/types/uploader.py
@@ -12,7 +12,7 @@ pysftp==0.*
12
12
  opentelemetry-api==1.*
13
13
  opentelemetry-exporter-otlp-proto-common==1.*
14
14
  opentelemetry-exporter-otlp-proto-http==1.*
15
- opentelemetry-sdk==1.*
15
+ opentelemetry-sdk<1.39.0
16
16
  paramiko==3.*
17
17
  boto3==1.*
18
18
  flask==3.*
@@ -3,8 +3,8 @@ from dataclasses import dataclass
3
3
  from uncountable.integration.http_server import (
4
4
  GenericHttpRequest,
5
5
  GenericHttpResponse,
6
+ HttpException,
6
7
  )
7
- from uncountable.integration.http_server.types import HttpException
8
8
  from uncountable.integration.job import CustomHttpJob, register_job
9
9
  from uncountable.types import job_definition_t
10
10
 
@@ -12,6 +12,8 @@ from uncountable.types import (
12
12
  )
13
13
  from uncountable.types.client_base import APIRequest
14
14
 
15
+ from pkgs.serialization_util import serialize_for_storage
16
+
15
17
  RUNSHEET_REF_NAME = "recipe_export_runsheet"
16
18
  RUNSHEET_REF_NAME_2 = "recipe_export_runsheet_2"
17
19
 
@@ -54,6 +56,12 @@ class StandardRunsheetGenerator(RunsheetWebhookJob):
54
56
  return_type=export_default_runsheet_t.Data,
55
57
  )
56
58
 
59
+ print(
60
+ "--------------------------------"
61
+ f"Runsheet metadata: {serialize_for_storage(response.default_runsheet_metadata.columns)}, "
62
+ "--------------------------------"
63
+ )
64
+
57
65
  file_query = download_file_t.FileDownloadQueryTextDocumentId(
58
66
  text_document_id=response.text_document_id,
59
67
  )
@@ -214,13 +214,16 @@ def _build_parser_discriminated_union(
214
214
 
215
215
 
216
216
  def _build_parser_inner(
217
- parsed_type: type[T],
217
+ parsed_type: type[T] | typing.TypeVar,
218
218
  context: ParserContext,
219
+ type_var_map: dict[typing.TypeVar, type],
219
220
  ) -> ParserFunction[T]:
220
221
  """
221
222
  IMPROVE: We can now cache at this level, to avoid producing redundant
222
223
  internal parsers.
223
224
  """
225
+ if isinstance(parsed_type, typing.TypeVar):
226
+ return _build_parser_inner(type_var_map[parsed_type], context, type_var_map)
224
227
 
225
228
  serial_union = get_serial_union_data(parsed_type)
226
229
  if serial_union is not None:
@@ -234,19 +237,40 @@ def _build_parser_inner(
234
237
  context,
235
238
  discriminator,
236
239
  {
237
- key: _build_parser_inner(value, context)
240
+ key: _build_parser_inner(value, context, type_var_map)
238
241
  for key, value in discriminator_map.items()
239
242
  },
240
243
  )
241
244
 
242
245
  if dataclasses.is_dataclass(parsed_type):
243
- return _build_parser_dataclass(parsed_type, context)
246
+ return _build_parser_dataclass(parsed_type, context, type_var_map)
247
+
248
+ origin = typing.get_origin(parsed_type)
249
+ type_args = typing.get_args(parsed_type)
250
+ if dataclasses.is_dataclass(origin) and type_args is not None:
251
+ new_type_var_map = {}
252
+ type_params = getattr(origin, "__parameters__", ())
253
+ for type_param, type_arg in zip(type_params, type_args, strict=True):
254
+ resolved_type_arg = type_arg
255
+ if isinstance(type_arg, typing.TypeVar) and type_arg in type_var_map:
256
+ resolved_type_arg = type_var_map[type_arg]
257
+
258
+ new_type_var_map[type_param] = resolved_type_arg
259
+
260
+ return _build_parser_dataclass(
261
+ origin, # type: ignore[arg-type]
262
+ context,
263
+ new_type_var_map,
264
+ )
244
265
 
245
266
  # namedtuple support
246
267
  if is_namedtuple_type(parsed_type):
247
268
  type_hints = typing.get_type_hints(parsed_type)
248
269
  field_parsers = [
249
- (field_name, _build_parser_inner(type_hints[field_name], context))
270
+ (
271
+ field_name,
272
+ _build_parser_inner(type_hints[field_name], context, type_var_map),
273
+ )
250
274
  for field_name in parsed_type.__annotations__
251
275
  ]
252
276
  return lambda value: parsed_type(**{
@@ -265,7 +289,6 @@ def _build_parser_inner(
265
289
  # Need to convince type checker that parsed_type is type(None)
266
290
  return typing.cast(ParserFunction[T], NONE_IDENTITY_PARSER)
267
291
 
268
- origin = typing.get_origin(parsed_type)
269
292
  if origin is tuple:
270
293
  args = typing.get_args(parsed_type)
271
294
  element_parsers: list[typing.Callable[[typing.Any], object]] = []
@@ -276,7 +299,7 @@ def _build_parser_inner(
276
299
  assert len(element_parsers) == 1
277
300
  has_ellipsis = True
278
301
  else:
279
- element_parsers.append(_build_parser_inner(arg, context))
302
+ element_parsers.append(_build_parser_inner(arg, context, type_var_map))
280
303
  return lambda value: _invoke_tuple_parsers(
281
304
  parsed_type, element_parsers, has_ellipsis, value
282
305
  )
@@ -287,7 +310,9 @@ def _build_parser_inner(
287
310
  args,
288
311
  key=lambda subtype: (0 if subtype == type(None) else 1), # noqa: E721
289
312
  )
290
- arg_parsers = [_build_parser_inner(arg, context) for arg in sorted_args]
313
+ arg_parsers = [
314
+ _build_parser_inner(arg, context, type_var_map) for arg in sorted_args
315
+ ]
291
316
  return lambda value: _invoke_fallback_parsers(parsed_type, arg_parsers, value)
292
317
 
293
318
  if parsed_type is typing.Any:
@@ -297,7 +322,7 @@ def _build_parser_inner(
297
322
  args = typing.get_args(parsed_type)
298
323
  if len(args) != 1:
299
324
  raise ValueError("List types only support one argument")
300
- arg_parser = _build_parser_inner(args[0], context)
325
+ arg_parser = _build_parser_inner(args[0], context, type_var_map)
301
326
 
302
327
  def parse_element(value: typing.Any) -> typing.Any:
303
328
  try:
@@ -319,6 +344,7 @@ def _build_parser_inner(
319
344
  k_inner_parser = _build_parser_inner(
320
345
  args[0],
321
346
  context,
347
+ type_var_map,
322
348
  )
323
349
 
324
350
  def key_parser(value: typing.Any) -> object:
@@ -333,7 +359,7 @@ def _build_parser_inner(
333
359
  return camel_to_snake_case(value)
334
360
  return inner
335
361
 
336
- v_parser = _build_parser_inner(args[1], context)
362
+ v_parser = _build_parser_inner(args[1], context, type_var_map)
337
363
  return lambda value: origin(
338
364
  (key_parser(k), v_parser(v)) for k, v in value.items()
339
365
  )
@@ -422,23 +448,36 @@ def _build_parser_inner(
422
448
  return _build_parser_inner(
423
449
  parsed_type.__origin__, # type: ignore[attr-defined]
424
450
  context,
451
+ type_var_map,
425
452
  )
426
453
 
427
454
  raise ValueError(f"Unhandled type {parsed_type}/{origin}")
428
455
 
429
456
 
457
+ # Take in map of parameter name to materialized type
430
458
  def _build_parser_dataclass(
431
459
  parsed_type: type[T],
432
460
  context: ParserContext,
461
+ type_var_map: dict[typing.TypeVar, type],
433
462
  ) -> ParserFunction[T]:
434
463
  """
435
464
  Use the cache so that recursion involve dataclasses is supported. This
436
465
  requires the build order is a bit inverted: the dataclass parser is added
437
466
  to the cache prior to building it's field parsers.
438
467
  """
439
- cur_parser = context.cache.get(parsed_type)
468
+
469
+ type_params = getattr(parsed_type, "__parameters__", None)
470
+ cache_key: typing.Any = parsed_type
471
+ if type_params is not None and type_var_map:
472
+ cache_key = (
473
+ parsed_type,
474
+ tuple(type_var_map.items()),
475
+ )
476
+
477
+ cur_parser = context.cache.get(cache_key)
440
478
  if cur_parser is not None:
441
479
  return cur_parser
480
+
442
481
  type_hints = typing.get_type_hints(parsed_type, include_extras=True)
443
482
  dc_field_parsers: list[
444
483
  tuple[
@@ -527,14 +566,17 @@ def _build_parser_dataclass(
527
566
  parser_function = parse
528
567
  context.cache[parsed_type] = parser_function
529
568
 
530
- dc_field_parsers = [
531
- (
569
+ dc_field_parsers = []
570
+ for field in dataclasses.fields(parsed_type): # type:ignore[arg-type]
571
+ field_type_hint = type_hints[field.name]
572
+ if isinstance(field_type_hint, typing.TypeVar):
573
+ field_type_hint = type_var_map[field_type_hint]
574
+
575
+ dc_field_parsers.append((
532
576
  field,
533
- type_hints[field.name],
534
- _build_parser_inner(type_hints[field.name], context),
535
- )
536
- for field in dataclasses.fields(parsed_type) # type:ignore[arg-type]
537
- ]
577
+ field_type_hint,
578
+ _build_parser_inner(field_type_hint, context, type_var_map),
579
+ ))
538
580
 
539
581
  return parser_function
540
582
 
@@ -559,7 +601,7 @@ def build_parser(
559
601
  return cur_parser
560
602
 
561
603
  context = ParserContext(options=options, cache=cache)
562
- built_parser = _build_parser_inner(parsed_type, context)
604
+ built_parser = _build_parser_inner(parsed_type, context, {})
563
605
  cache[parsed_type] = built_parser
564
606
  return built_parser
565
607
 
@@ -476,7 +476,7 @@ class SpecTypeGenericParameter(SpecType):
476
476
  return True
477
477
 
478
478
  def is_value_to_string(self) -> bool:
479
- return True
479
+ return False
480
480
 
481
481
  def is_valid_parameter(self) -> bool:
482
482
  return True
@@ -491,6 +491,7 @@ class SpecTypeGenericParameter(SpecType):
491
491
  class SpecTypeDefnObject(SpecTypeDefn):
492
492
  base: SpecTypeDefnObject | None
493
493
  parameters: list[str]
494
+ base_type_instance: SpecTypeInstance | None
494
495
 
495
496
  def __init__(
496
497
  self,
@@ -514,6 +515,7 @@ class SpecTypeDefnObject(SpecTypeDefn):
514
515
  self.parameters = parameters if parameters is not None else []
515
516
  self.is_hashable = is_hashable
516
517
  self.base = None
518
+ self.base_type_instance = None
517
519
  self.properties: dict[str, SpecProperty] | None = None
518
520
  self._kw_only: bool = True
519
521
  self.desc: str | None = None
@@ -545,6 +547,11 @@ class SpecTypeDefnObject(SpecTypeDefn):
545
547
  ["type", "desc", "properties", "name_case", "hashable", "kw_only"],
546
548
  )
547
549
  type_base = builder.parse_type(self.namespace, data["type"], scope=self)
550
+
551
+ if isinstance(type_base, SpecTypeInstance):
552
+ self.base_type_instance = type_base
553
+ type_base = type_base.defn_type
554
+
548
555
  builder.ensure(
549
556
  isinstance(type_base, SpecTypeDefnObject),
550
557
  "unsupported base type: not an Object",
@@ -928,10 +928,15 @@ def _emit_type(ctx: Context, stype: builder.SpecType) -> None:
928
928
  class_out = io.StringIO()
929
929
  base_class = ""
930
930
  generics = stype.get_generics()
931
- if not stype.base.is_base:
932
- base_class = f"({refer_to(ctx, stype.base)})"
933
- elif len(generics) > 0:
931
+ if len(generics) > 0:
934
932
  base_class = f"[{', '.join(generics)}]"
933
+
934
+ if not stype.base.is_base:
935
+ if stype.base_type_instance is not None:
936
+ base_class += f"({refer_to(ctx, stype.base_type_instance)})"
937
+ else:
938
+ base_class += f"({refer_to(ctx, stype.base)})"
939
+
935
940
  class_out.write(f"class {stype.name}{base_class}:\n")
936
941
 
937
942
  emitted_properties_metadata = _emit_type_properties(
@@ -942,8 +947,6 @@ def _emit_type(ctx: Context, stype: builder.SpecType) -> None:
942
947
  to_string_values = emitted_properties_metadata.to_string_values
943
948
  parse_require = emitted_properties_metadata.parse_require
944
949
 
945
- _emit_generics(ctx, generics)
946
-
947
950
  # Emit serial_class decorator
948
951
  ctx.out.write("@serial_class(\n")
949
952
  ctx.out.write(
@@ -985,12 +988,6 @@ def _emit_type(ctx: Context, stype: builder.SpecType) -> None:
985
988
  ctx.out.write(class_out.getvalue())
986
989
 
987
990
 
988
- def _emit_generics(ctx: Context, generics: list[str]) -> None:
989
- for generic in generics:
990
- ctx.out.write(f'{generic} = typing.TypeVar("{generic}")\n')
991
- ctx.out.write(f"{LINE_BREAK}{LINE_BREAK}")
992
-
993
-
994
991
  def _emit_constant(ctx: Context, sconst: builder.SpecConstant) -> None:
995
992
  ctx.out.write("\n\n")
996
993
  ctx.out.write(MODIFY_NOTICE)
@@ -186,7 +186,10 @@ def emit_type_ts(ctx: EmitTypescriptContext, stype: builder.SpecType) -> None:
186
186
 
187
187
  base_type = ""
188
188
  if not stype.base.is_base:
189
- base_type = f"{refer_to(ctx, stype.base)} & "
189
+ if stype.base_type_instance is not None:
190
+ base_type = f"({refer_to(ctx, stype.base_type_instance)}) & "
191
+ else:
192
+ base_type = f"{refer_to(ctx, stype.base)} & "
190
193
 
191
194
  if stype.properties is None and base_type == "":
192
195
  ctx.out.write(f"export type {stype.name} = TEmpty\n")
@@ -32,3 +32,6 @@ export interface nominal<T> {
32
32
 
33
33
  // Ids matching a strict integer number are converted to integers
34
34
  export const ID_REGEX = /^-?[1-9][0-9]{0,20}$/
35
+ // Matches ISO 8601 dates. Stricter than `Date.parse`.
36
+ // https://www.w3.org/TR/NOTE-datetime
37
+ export const ISO8601_DATE_REGEX = /^(\d{4}-\d{2}-\d{2})T(\d{2}:\d{2}:\d{2})(\.\d+)?([+-]\d{2}:?\d{2}|Z)$/
@@ -22,7 +22,6 @@ find = {}
22
22
  [tool.setuptools_scm]
23
23
  fallback_version = "0.0.0"
24
24
  local_scheme = "no-local-version"
25
- tag_regex = "^(?:v)?(?P<version>\\d+\\.\\d+\\.\\d+)$"
26
25
 
27
26
 
28
27
  ########################################################################################
@@ -66,7 +65,7 @@ dependencies = [
66
65
  "opentelemetry-api==1.*",
67
66
  "opentelemetry-exporter-otlp-proto-common==1.*",
68
67
  "opentelemetry-exporter-otlp-proto-http==1.*",
69
- "opentelemetry-sdk==1.*",
68
+ "opentelemetry-sdk < 1.39.0",
70
69
  "paramiko ==3.*",
71
70
  "boto3 == 1.*",
72
71
  "flask == 3.*",
@@ -185,6 +185,7 @@ class Client(ClientMethods):
185
185
  base_url: str,
186
186
  auth_details: AuthDetailsAll,
187
187
  config: ClientConfig | None = None,
188
+ app_base_url: str | None = None,
188
189
  ):
189
190
  self._auth_details = auth_details
190
191
  self._base_url = base_url
@@ -192,10 +193,11 @@ class Client(ClientMethods):
192
193
  self._session = requests.Session()
193
194
  self._session.verify = not self._cfg.allow_insecure_tls
194
195
  self._file_uploader = FileUploader(
195
- self._base_url,
196
- self._auth_details,
197
- self._cfg.allow_insecure_tls,
196
+ base_url=self._base_url,
197
+ auth_details=self._auth_details,
198
+ allow_insecure_tls=self._cfg.allow_insecure_tls,
198
199
  logger=self._cfg.logger,
200
+ app_base_url=app_base_url,
199
201
  )
200
202
 
201
203
  @classmethod
@@ -70,22 +70,26 @@ class UploadFailed(Exception):
70
70
  class FileUploader:
71
71
  _auth_details: AuthDetailsAll
72
72
  _base_url: str
73
+ _app_base_url: str
73
74
  _allow_insecure_tls: bool
74
75
 
75
76
  def __init__(
76
77
  self: Self,
78
+ *,
77
79
  base_url: str,
78
80
  auth_details: AuthDetailsAll,
79
81
  allow_insecure_tls: bool = False,
80
82
  logger: Logger | None = None,
83
+ app_base_url: str | None = None,
81
84
  ) -> None:
82
85
  self._base_url = base_url
86
+ self._app_base_url = app_base_url if app_base_url is not None else base_url
83
87
  self._auth_details = auth_details
84
88
  self._allow_insecure_tls = allow_insecure_tls
85
89
  self._logger = logger
86
90
 
87
91
  async def _upload_file(self: Self, file_upload: FileUpload) -> UploadedFile:
88
- creation_url = f"{self._base_url}/api/external/file_upload/files"
92
+ creation_url = f"{self._app_base_url}/api/external/file_upload/files"
89
93
  if not isinstance(self._auth_details, AuthDetailsApiKey):
90
94
  raise NotImplementedError("Unsupported authentication method.")
91
95
 
@@ -48,4 +48,5 @@ def construct_uncountable_client(
48
48
  base_url=profile_meta.base_url,
49
49
  auth_details=_construct_auth_details(profile_meta),
50
50
  config=_construct_client_config(profile_meta, logger),
51
+ app_base_url=profile_meta.app_base_url,
51
52
  )
@@ -1,7 +1,9 @@
1
1
  import asyncio
2
+ import resource
2
3
  from concurrent.futures import ProcessPoolExecutor
3
4
  from dataclasses import dataclass
4
5
 
6
+ import psutil
5
7
  from opentelemetry.trace import get_current_span
6
8
 
7
9
  from uncountable.core.async_batch import AsyncBatchProcessor
@@ -82,6 +84,10 @@ def run_queued_job(
82
84
  queued_job: queued_job_t.QueuedJob,
83
85
  ) -> job_definition_t.JobResult:
84
86
  with get_otel_tracer().start_as_current_span(name="run_queued_job") as span:
87
+ total_mem = psutil.virtual_memory().total
88
+ limit_bytes = int(total_mem * 0.9)
89
+ resource.setrlimit(resource.RLIMIT_AS, (limit_bytes, limit_bytes))
90
+
85
91
  job_details = get_registered_job_details(queued_job.job_ref_name)
86
92
  job_logger = JobLogger(
87
93
  base_span=span,
@@ -43,6 +43,7 @@ def load_profiles() -> list[job_definition_t.ProfileMetadata]:
43
43
  name=profile_name,
44
44
  jobs=definition.jobs,
45
45
  base_url=environment_config.base_url,
46
+ app_base_url=environment_config.app_base_url,
46
47
  auth_retrieval=environment_config.auth_retrieval,
47
48
  client_options=environment_config.client_options,
48
49
  )
@@ -57,6 +58,7 @@ def load_profiles() -> list[job_definition_t.ProfileMetadata]:
57
58
  name=profile_name,
58
59
  jobs=definition.jobs,
59
60
  base_url=definition.base_url,
61
+ app_base_url=definition.app_base_url,
60
62
  auth_retrieval=definition.auth_retrieval,
61
63
  client_options=definition.client_options,
62
64
  )
@@ -1,6 +1,7 @@
1
1
  import functools
2
2
  import json
3
3
  import os
4
+ import resource
4
5
  import threading
5
6
  import time
6
7
  import traceback
@@ -12,6 +13,7 @@ from typing import Generator, assert_never, cast
12
13
 
13
14
  import psutil
14
15
  from opentelemetry import _logs, trace
16
+ from opentelemetry.context import get_current
15
17
  from opentelemetry.exporter.otlp.proto.http._log_exporter import OTLPLogExporter
16
18
  from opentelemetry.exporter.otlp.proto.http.trace_exporter import OTLPSpanExporter
17
19
  from opentelemetry.sdk._logs import Logger as OTELLogger
@@ -25,7 +27,7 @@ from opentelemetry.sdk.trace import TracerProvider
25
27
  from opentelemetry.sdk.trace.export import (
26
28
  SimpleSpanProcessor,
27
29
  )
28
- from opentelemetry.trace import DEFAULT_TRACE_OPTIONS, Span, Tracer
30
+ from opentelemetry.trace import Span, Tracer
29
31
 
30
32
  from uncountable.core.environment import (
31
33
  get_otel_enabled,
@@ -87,6 +89,19 @@ class LogSeverity(StrEnum):
87
89
  ERROR = "Error"
88
90
 
89
91
 
92
+ def _get_severity_number(severity: LogSeverity) -> _logs.SeverityNumber:
93
+ """Map LogSeverity to OpenTelemetry SeverityNumber for Datadog."""
94
+ match severity:
95
+ case LogSeverity.INFO:
96
+ return _logs.SeverityNumber.INFO
97
+ case LogSeverity.WARN:
98
+ return _logs.SeverityNumber.WARN
99
+ case LogSeverity.ERROR:
100
+ return _logs.SeverityNumber.ERROR
101
+ case _:
102
+ assert_never(severity)
103
+
104
+
90
105
  class Logger:
91
106
  current_span: Span
92
107
 
@@ -134,10 +149,8 @@ class Logger:
134
149
  attributes=self._patch_attributes(
135
150
  message=message, severity=severity, attributes=attributes
136
151
  ),
137
- span_id=self.current_span_id,
138
- trace_id=self.current_trace_id,
139
- trace_flags=DEFAULT_TRACE_OPTIONS,
140
- severity_number=_logs.SeverityNumber.UNSPECIFIED,
152
+ context=get_current(),
153
+ severity_number=_get_severity_number(severity),
141
154
  resource=get_otel_resource(),
142
155
  )
143
156
  otel_logger.emit(log_record)
@@ -237,7 +250,18 @@ class PerJobResourceTracker:
237
250
  ) -> None:
238
251
  self.stop()
239
252
  stats = dict(self.summary())
253
+ if isinstance(exc_value, MemoryError):
254
+ limit, _ = resource.getrlimit(resource.RLIMIT_AS)
255
+ self.logger.log_exception(
256
+ exc_value,
257
+ message=(
258
+ f"Job '{self.logger.job_definition.name}' (ID={self.logger.job_definition.id}) "
259
+ f"exceeded memory limit ({limit / (1024**3):.2f} GB)."
260
+ ),
261
+ )
262
+ return
240
263
  self.logger.log_info("Job resource usage summary", attributes=stats)
264
+ return
241
265
 
242
266
  def summary(self) -> Attributes:
243
267
  assert self.start_cpu_times is not None
@@ -106,6 +106,8 @@ from .api.entity import resolve_entity_ids as resolve_entity_ids_t
106
106
  from .api.outputs import resolve_output_conditions as resolve_output_conditions_t
107
107
  from . import response_t as response_t
108
108
  from .api.triggers import run_trigger as run_trigger_t
109
+ from . import runsheet_format_t as runsheet_format_t
110
+ from . import runsheet_t as runsheet_t
109
111
  from . import secret_retrieval_t as secret_retrieval_t
110
112
  from .api.entity import set_barcode as set_barcode_t
111
113
  from .api.permissions import set_core_permissions as set_core_permissions_t
@@ -123,6 +125,7 @@ from .api.recipes import set_recipe_tags as set_recipe_tags_t
123
125
  from .api.recipes import set_recipe_total as set_recipe_total_t
124
126
  from .api.entity import set_values as set_values_t
125
127
  from . import sockets_t as sockets_t
128
+ from . import specs_t as specs_t
126
129
  from .api.entity import transition_entity_phase as transition_entity_phase_t
127
130
  from .api.recipes import unarchive_recipes as unarchive_recipes_t
128
131
  from . import units_t as units_t
@@ -242,6 +245,8 @@ __all__: list[str] = [
242
245
  "resolve_output_conditions_t",
243
246
  "response_t",
244
247
  "run_trigger_t",
248
+ "runsheet_format_t",
249
+ "runsheet_t",
245
250
  "secret_retrieval_t",
246
251
  "set_barcode_t",
247
252
  "set_core_permissions_t",
@@ -259,6 +264,7 @@ __all__: list[str] = [
259
264
  "set_recipe_total_t",
260
265
  "set_values_t",
261
266
  "sockets_t",
267
+ "specs_t",
262
268
  "transition_entity_phase_t",
263
269
  "unarchive_recipes_t",
264
270
  "units_t",
@@ -38,7 +38,6 @@ class AttributeValue:
38
38
  # DO NOT MODIFY -- This file is generated by type_spec
39
39
  @serial_class(
40
40
  named_type_path="sdk.api.entity.list_aggregate.Arguments",
41
- unconverted_values={"attribute_values"},
42
41
  )
43
42
  @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
44
43
  class Arguments:
@@ -11,6 +11,7 @@ from pkgs.serialization import serial_class
11
11
  from ... import base_t
12
12
  from ... import entity_t
13
13
  from ... import identifier_t
14
+ from ... import runsheet_t
14
15
 
15
16
  __all__: list[str] = [
16
17
  "Arguments",
@@ -41,4 +42,5 @@ class Arguments:
41
42
  @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
42
43
  class Data:
43
44
  text_document_id: base_t.ObjectId
45
+ default_runsheet_metadata: runsheet_t.DefaultRunsheet
44
46
  # DO NOT MODIFY -- This file is generated by type_spec