UncountablePythonSDK 0.0.71__tar.gz → 0.0.73__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 (294) hide show
  1. {uncountablepythonsdk-0.0.71/UncountablePythonSDK.egg-info → uncountablepythonsdk-0.0.73}/PKG-INFO +1 -1
  2. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73/UncountablePythonSDK.egg-info}/PKG-INFO +1 -1
  3. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/examples/integration-server/jobs/materials_auto/profile.yaml +1 -1
  4. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/examples/integration-server/pyproject.toml +1 -1
  5. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/pkgs/serialization/serial_class.py +5 -0
  6. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/pkgs/serialization/serial_union.py +3 -0
  7. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/pkgs/type_spec/builder.py +2 -1
  8. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/pkgs/type_spec/config.py +5 -0
  9. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/pkgs/type_spec/emit_python.py +36 -20
  10. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/pkgs/type_spec/load_types.py +3 -2
  11. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/core/client.py +2 -2
  12. uncountablepythonsdk-0.0.73/uncountable/integration/cli.py +49 -0
  13. uncountablepythonsdk-0.0.73/uncountable/integration/entrypoint.py +13 -0
  14. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/integration/queue_runner/worker.py +9 -5
  15. uncountablepythonsdk-0.0.73/uncountable/integration/server.py +125 -0
  16. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/types/api/batch/execute_batch.py +8 -0
  17. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/types/api/batch/execute_batch_load_async.py +7 -0
  18. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/types/api/chemical/convert_chemical_formats.py +7 -0
  19. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/types/api/entity/create_entities.py +11 -1
  20. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/types/api/entity/create_entity.py +8 -1
  21. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/types/api/entity/get_entities_data.py +10 -0
  22. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/types/api/entity/list_entities.py +8 -0
  23. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/types/api/entity/lock_entity.py +7 -0
  24. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/types/api/entity/resolve_entity_ids.py +10 -0
  25. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/types/api/entity/set_values.py +7 -0
  26. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/types/api/entity/transition_entity_phase.py +8 -0
  27. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/types/api/entity/unlock_entity.py +7 -0
  28. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/types/api/equipment/associate_equipment_input.py +7 -0
  29. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/types/api/field_options/upsert_field_options.py +10 -0
  30. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/types/api/id_source/list_id_source.py +10 -0
  31. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/types/api/id_source/match_id_source.py +10 -0
  32. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/types/api/input_groups/get_input_group_names.py +10 -0
  33. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/types/api/inputs/create_inputs.py +13 -0
  34. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/types/api/inputs/get_input_data.py +19 -0
  35. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/types/api/inputs/get_input_names.py +10 -0
  36. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/types/api/inputs/get_inputs_data.py +19 -0
  37. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/types/api/inputs/set_input_attribute_values.py +7 -0
  38. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/types/api/inputs/set_input_category.py +7 -0
  39. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/types/api/inputs/set_input_subcategories.py +7 -0
  40. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/types/api/inputs/set_intermediate_type.py +7 -0
  41. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/types/api/material_families/update_entity_material_families.py +7 -0
  42. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/types/api/outputs/get_output_data.py +16 -0
  43. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/types/api/outputs/get_output_names.py +10 -0
  44. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/types/api/outputs/resolve_output_conditions.py +13 -0
  45. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/types/api/permissions/set_core_permissions.py +10 -0
  46. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/types/api/project/get_projects.py +10 -0
  47. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/types/api/project/get_projects_data.py +10 -0
  48. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/types/api/recipe_links/create_recipe_link.py +7 -0
  49. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/types/api/recipe_links/remove_recipe_link.py +7 -0
  50. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/types/api/recipe_metadata/get_recipe_metadata_data.py +10 -0
  51. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/types/api/recipes/add_recipe_to_project.py +7 -0
  52. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/types/api/recipes/archive_recipes.py +7 -0
  53. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/types/api/recipes/associate_recipe_as_input.py +7 -0
  54. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/types/api/recipes/associate_recipe_as_lot.py +7 -0
  55. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/types/api/recipes/clear_recipe_outputs.py +7 -0
  56. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/types/api/recipes/create_recipe.py +7 -0
  57. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/types/api/recipes/create_recipes.py +13 -0
  58. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/types/api/recipes/disassociate_recipe_as_input.py +7 -0
  59. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/types/api/recipes/edit_recipe_inputs.py +20 -0
  60. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/types/api/recipes/get_curve.py +7 -0
  61. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/types/api/recipes/get_recipe_calculations.py +7 -0
  62. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/types/api/recipes/get_recipe_links.py +7 -0
  63. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/types/api/recipes/get_recipe_names.py +10 -0
  64. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/types/api/recipes/get_recipe_output_metadata.py +7 -0
  65. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/types/api/recipes/get_recipes_data.py +25 -0
  66. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/types/api/recipes/lock_recipes.py +10 -0
  67. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/types/api/recipes/remove_recipe_from_project.py +7 -0
  68. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/types/api/recipes/set_recipe_inputs.py +7 -0
  69. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/types/api/recipes/set_recipe_metadata.py +7 -0
  70. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/types/api/recipes/set_recipe_output_annotations.py +13 -0
  71. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/types/api/recipes/set_recipe_output_file.py +10 -0
  72. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/types/api/recipes/set_recipe_outputs.py +10 -0
  73. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/types/api/recipes/set_recipe_tags.py +12 -0
  74. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/types/api/recipes/unarchive_recipes.py +7 -0
  75. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/types/api/recipes/unlock_recipes.py +7 -0
  76. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/types/api/triggers/run_trigger.py +7 -0
  77. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/types/api/uploader/invoke_uploader.py +7 -0
  78. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/types/async_batch_t.py +10 -0
  79. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/types/calculations_t.py +4 -0
  80. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/types/chemical_structure_t.py +1 -0
  81. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/types/client_base.py +2 -2
  82. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/types/client_config_t.py +4 -0
  83. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/types/curves_t.py +4 -0
  84. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/types/entity_t.py +6 -0
  85. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/types/experiment_groups_t.py +4 -0
  86. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/types/field_values_t.py +4 -0
  87. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/types/fields_t.py +4 -0
  88. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/types/generic_upload_t.py +13 -0
  89. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/types/id_source_t.py +13 -0
  90. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/types/identifier_t.py +3 -0
  91. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/types/input_attributes_t.py +1 -0
  92. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/types/inputs_t.py +4 -0
  93. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/types/job_definition_t.py +33 -0
  94. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/types/outputs_t.py +4 -0
  95. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/types/overrides_t.py +7 -0
  96. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/types/phases_t.py +4 -0
  97. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/types/queued_job_t.py +16 -0
  98. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/types/recipe_identifiers_t.py +3 -0
  99. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/types/recipe_links_t.py +4 -0
  100. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/types/recipe_metadata_t.py +5 -0
  101. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/types/recipe_output_metadata_t.py +4 -0
  102. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/types/recipe_tags_t.py +4 -0
  103. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/types/recipe_workflow_steps_t.py +7 -0
  104. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/types/recipes_t.py +4 -0
  105. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/types/response_t.py +1 -0
  106. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/types/secret_retrieval_t.py +6 -0
  107. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/types/units_t.py +4 -0
  108. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/types/users_t.py +4 -0
  109. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/types/webhook_job_t.py +4 -0
  110. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/types/workflows_t.py +7 -0
  111. uncountablepythonsdk-0.0.71/uncountable/integration/cli.py +0 -75
  112. uncountablepythonsdk-0.0.71/uncountable/integration/entrypoint.py +0 -21
  113. uncountablepythonsdk-0.0.71/uncountable/integration/server.py +0 -128
  114. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/.github/workflows/documentation.yml +0 -0
  115. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/.github/workflows/publish.yml +0 -0
  116. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/.gitignore +0 -0
  117. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/README.md +0 -0
  118. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/UncountablePythonSDK.egg-info/SOURCES.txt +0 -0
  119. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/UncountablePythonSDK.egg-info/dependency_links.txt +0 -0
  120. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/UncountablePythonSDK.egg-info/requires.txt +0 -0
  121. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/UncountablePythonSDK.egg-info/top_level.txt +0 -0
  122. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/docs/.gitignore +0 -0
  123. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/docs/conf.py +0 -0
  124. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/docs/index.md +0 -0
  125. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/docs/justfile +0 -0
  126. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/docs/quickstart.md +0 -0
  127. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/docs/requirements.txt +0 -0
  128. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/docs/static/favicons/android-chrome-192x192.png +0 -0
  129. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/docs/static/favicons/android-chrome-512x512.png +0 -0
  130. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/docs/static/favicons/apple-touch-icon.png +0 -0
  131. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/docs/static/favicons/browserconfig.xml +0 -0
  132. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/docs/static/favicons/favicon-16x16.png +0 -0
  133. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/docs/static/favicons/favicon-32x32.png +0 -0
  134. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/docs/static/favicons/manifest.json +0 -0
  135. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/docs/static/favicons/mstile-150x150.png +0 -0
  136. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/docs/static/favicons/safari-pinned-tab.svg +0 -0
  137. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/docs/static/logo_blue.png +0 -0
  138. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/examples/async_batch.py +0 -0
  139. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/examples/create_entity.py +0 -0
  140. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/examples/edit_recipe_inputs.py +0 -0
  141. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/examples/integration-server/jobs/materials_auto/example_cron.py +0 -0
  142. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/examples/invoke_uploader.py +0 -0
  143. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/examples/set_recipe_metadata_file.py +0 -0
  144. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/examples/set_recipe_output_file_sdk.py +0 -0
  145. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/examples/upload_files.py +0 -0
  146. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/pkgs/__init__.py +0 -0
  147. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/pkgs/argument_parser/__init__.py +0 -0
  148. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/pkgs/argument_parser/_is_enum.py +0 -0
  149. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/pkgs/argument_parser/_is_namedtuple.py +0 -0
  150. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/pkgs/argument_parser/argument_parser.py +0 -0
  151. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/pkgs/argument_parser/case_convert.py +0 -0
  152. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/pkgs/filesystem_utils/__init__.py +0 -0
  153. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/pkgs/filesystem_utils/_gdrive_session.py +0 -0
  154. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/pkgs/filesystem_utils/_local_session.py +0 -0
  155. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/pkgs/filesystem_utils/_s3_session.py +0 -0
  156. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/pkgs/filesystem_utils/_sftp_session.py +0 -0
  157. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/pkgs/filesystem_utils/file_type_utils.py +0 -0
  158. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/pkgs/filesystem_utils/filesystem_session.py +0 -0
  159. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/pkgs/py.typed +0 -0
  160. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/pkgs/serialization/__init__.py +0 -0
  161. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/pkgs/serialization/missing_sentry.py +0 -0
  162. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/pkgs/serialization/opaque_key.py +0 -0
  163. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/pkgs/serialization/yaml.py +0 -0
  164. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/pkgs/serialization_util/__init__.py +0 -0
  165. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/pkgs/serialization_util/_get_type_for_serialization.py +0 -0
  166. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/pkgs/serialization_util/convert_to_snakecase.py +0 -0
  167. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/pkgs/serialization_util/serialization_helpers.py +0 -0
  168. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/pkgs/strenum_compat/__init__.py +0 -0
  169. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/pkgs/strenum_compat/strenum_compat.py +0 -0
  170. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/pkgs/type_spec/__init__.py +0 -0
  171. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/pkgs/type_spec/__main__.py +0 -0
  172. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/pkgs/type_spec/actions_registry/__init__.py +0 -0
  173. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/pkgs/type_spec/actions_registry/__main__.py +0 -0
  174. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/pkgs/type_spec/actions_registry/emit_typescript.py +0 -0
  175. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/pkgs/type_spec/emit_io_ts.py +0 -0
  176. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/pkgs/type_spec/emit_open_api.py +0 -0
  177. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/pkgs/type_spec/emit_open_api_util.py +0 -0
  178. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/pkgs/type_spec/emit_typescript.py +0 -0
  179. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/pkgs/type_spec/emit_typescript_util.py +0 -0
  180. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/pkgs/type_spec/open_api_util.py +0 -0
  181. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/pkgs/type_spec/parts/base.py.prepart +0 -0
  182. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/pkgs/type_spec/parts/base.ts.prepart +0 -0
  183. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/pkgs/type_spec/test.py +0 -0
  184. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/pkgs/type_spec/type_info/__main__.py +0 -0
  185. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/pkgs/type_spec/type_info/emit_type_info.py +0 -0
  186. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/pkgs/type_spec/util.py +0 -0
  187. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/pkgs/type_spec/value_spec/__init__.py +0 -0
  188. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/pkgs/type_spec/value_spec/__main__.py +0 -0
  189. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/pkgs/type_spec/value_spec/convert_type.py +0 -0
  190. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/pkgs/type_spec/value_spec/emit_python.py +0 -0
  191. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/pkgs/type_spec/value_spec/types.py +0 -0
  192. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/pyproject.toml +0 -0
  193. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/setup.cfg +0 -0
  194. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/__init__.py +0 -0
  195. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/core/__init__.py +0 -0
  196. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/core/async_batch.py +0 -0
  197. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/core/environment.py +0 -0
  198. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/core/file_upload.py +0 -0
  199. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/core/types.py +0 -0
  200. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/integration/__init__.py +0 -0
  201. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/integration/construct_client.py +0 -0
  202. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/integration/cron.py +0 -0
  203. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/integration/db/__init__.py +0 -0
  204. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/integration/db/connect.py +0 -0
  205. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/integration/db/session.py +0 -0
  206. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/integration/executors/__init__.py +0 -0
  207. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/integration/executors/executors.py +0 -0
  208. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/integration/executors/generic_upload_executor.py +0 -0
  209. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/integration/executors/script_executor.py +0 -0
  210. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/integration/job.py +0 -0
  211. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/integration/queue_runner/__init__.py +0 -0
  212. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/integration/queue_runner/command_server/__init__.py +0 -0
  213. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/integration/queue_runner/command_server/command_client.py +0 -0
  214. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/integration/queue_runner/command_server/command_server.py +0 -0
  215. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/integration/queue_runner/command_server/protocol/__init__.py +0 -0
  216. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/integration/queue_runner/command_server/protocol/command_server.proto +0 -0
  217. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/integration/queue_runner/command_server/protocol/command_server_pb2.py +0 -0
  218. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/integration/queue_runner/command_server/protocol/command_server_pb2.pyi +0 -0
  219. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/integration/queue_runner/command_server/protocol/command_server_pb2_grpc.py +0 -0
  220. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/integration/queue_runner/command_server/types.py +0 -0
  221. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/integration/queue_runner/datastore/__init__.py +0 -0
  222. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/integration/queue_runner/datastore/datastore_sqlite.py +0 -0
  223. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/integration/queue_runner/datastore/interface.py +0 -0
  224. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/integration/queue_runner/datastore/model.py +0 -0
  225. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/integration/queue_runner/job_scheduler.py +0 -0
  226. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/integration/queue_runner/queue_runner.py +0 -0
  227. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/integration/queue_runner/types.py +0 -0
  228. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/integration/scan_profiles.py +0 -0
  229. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/integration/scheduler.py +0 -0
  230. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/integration/secret_retrieval/__init__.py +0 -0
  231. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/integration/secret_retrieval/retrieve_secret.py +0 -0
  232. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/integration/telemetry.py +0 -0
  233. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/integration/webhook_server/entrypoint.py +0 -0
  234. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/py.typed +0 -0
  235. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/types/__init__.py +0 -0
  236. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/types/api/__init__.py +0 -0
  237. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/types/api/batch/__init__.py +0 -0
  238. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/types/api/chemical/__init__.py +0 -0
  239. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/types/api/entity/__init__.py +0 -0
  240. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/types/api/equipment/__init__.py +0 -0
  241. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/types/api/field_options/__init__.py +0 -0
  242. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/types/api/id_source/__init__.py +0 -0
  243. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/types/api/input_groups/__init__.py +0 -0
  244. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/types/api/inputs/__init__.py +0 -0
  245. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/types/api/material_families/__init__.py +0 -0
  246. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/types/api/outputs/__init__.py +0 -0
  247. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/types/api/permissions/__init__.py +0 -0
  248. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/types/api/project/__init__.py +0 -0
  249. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/types/api/recipe_links/__init__.py +0 -0
  250. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/types/api/recipe_metadata/__init__.py +0 -0
  251. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/types/api/recipes/__init__.py +0 -0
  252. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/types/api/triggers/__init__.py +0 -0
  253. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/types/api/uploader/__init__.py +0 -0
  254. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/types/async_batch.py +0 -0
  255. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/types/async_batch_processor.py +0 -0
  256. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/types/base.py +0 -0
  257. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/types/base_t.py +0 -0
  258. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/types/calculations.py +0 -0
  259. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/types/chemical_structure.py +0 -0
  260. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/types/client_config.py +0 -0
  261. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/types/curves.py +0 -0
  262. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/types/entity.py +0 -0
  263. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/types/experiment_groups.py +0 -0
  264. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/types/field_values.py +0 -0
  265. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/types/fields.py +0 -0
  266. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/types/generic_upload.py +0 -0
  267. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/types/id_source.py +0 -0
  268. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/types/identifier.py +0 -0
  269. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/types/input_attributes.py +0 -0
  270. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/types/inputs.py +0 -0
  271. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/types/job_definition.py +0 -0
  272. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/types/outputs.py +0 -0
  273. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/types/overrides.py +0 -0
  274. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/types/permissions.py +0 -0
  275. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/types/permissions_t.py +0 -0
  276. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/types/phases.py +0 -0
  277. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/types/post_base.py +0 -0
  278. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/types/post_base_t.py +0 -0
  279. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/types/queued_job.py +0 -0
  280. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/types/recipe_identifiers.py +0 -0
  281. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/types/recipe_inputs.py +0 -0
  282. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/types/recipe_inputs_t.py +0 -0
  283. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/types/recipe_links.py +0 -0
  284. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/types/recipe_metadata.py +0 -0
  285. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/types/recipe_output_metadata.py +0 -0
  286. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/types/recipe_tags.py +0 -0
  287. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/types/recipe_workflow_steps.py +0 -0
  288. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/types/recipes.py +0 -0
  289. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/types/response.py +0 -0
  290. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/types/secret_retrieval.py +0 -0
  291. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/types/units.py +0 -0
  292. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/types/users.py +0 -0
  293. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/types/webhook_job.py +0 -0
  294. {uncountablepythonsdk-0.0.71 → uncountablepythonsdk-0.0.73}/uncountable/types/workflows.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: UncountablePythonSDK
3
- Version: 0.0.71
3
+ Version: 0.0.73
4
4
  Summary: Uncountable SDK
5
5
  Project-URL: Homepage, https://github.com/uncountableinc/uncountable-python-sdk
6
6
  Project-URL: Repository, https://github.com/uncountableinc/uncountable-python-sdk.git
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: UncountablePythonSDK
3
- Version: 0.0.71
3
+ Version: 0.0.73
4
4
  Summary: Uncountable SDK
5
5
  Project-URL: Homepage, https://github.com/uncountableinc/uncountable-python-sdk
6
6
  Project-URL: Repository, https://github.com/uncountableinc/uncountable-python-sdk.git
@@ -1,4 +1,4 @@
1
- base_url: http://0.0.0.0:5000
1
+ base_url: http://host.docker.internal:5000
2
2
  auth_retrieval:
3
3
  type: basic
4
4
  api_id_secret:
@@ -9,7 +9,7 @@ dependencies = [
9
9
  "ruff == 0.*",
10
10
  "openpyxl == 3.*",
11
11
  "more_itertools == 10.*",
12
- "types-paramiko == 3.4.0.20240423",
12
+ "types-paramiko ==3.5.0.20240918",
13
13
  "types-openpyxl == 3.*",
14
14
  "types-pysftp == 0.*",
15
15
  "types-pytz == 2024.*",
@@ -14,6 +14,7 @@ class _SerialClassData:
14
14
  unconverted_values: set[str] = dataclasses.field(default_factory=set)
15
15
  to_string_values: set[str] = dataclasses.field(default_factory=set)
16
16
  parse_require: set[str] = dataclasses.field(default_factory=set)
17
+ named_type_path: Optional[str] = None
17
18
 
18
19
 
19
20
  EMPTY_SERIAL_CLASS_DATA = _SerialClassData()
@@ -25,6 +26,7 @@ def serial_class(
25
26
  unconverted_values: Optional[set[str]] = None,
26
27
  to_string_values: Optional[set[str]] = None,
27
28
  parse_require: Optional[set[str]] = None,
29
+ named_type_path: Optional[str] = None,
28
30
  ) -> Callable[[_ClassT], _ClassT]:
29
31
  """
30
32
  An additional decorator to a dataclass that specifies serialization options.
@@ -45,6 +47,8 @@ def serial_class(
45
47
  This field is always required while parsing, even if it has a default in the definition.
46
48
  This allows supporting literal type defaults for Python instantiation, but
47
49
  requiring them for the API input.
50
+ @param named_type_path
51
+ The type_spec type-path to this type. This applies only to named types.
48
52
  """
49
53
 
50
54
  def decorate(orig_class: _ClassT) -> _ClassT:
@@ -53,6 +57,7 @@ def serial_class(
53
57
  unconverted_values=unconverted_values or set(),
54
58
  to_string_values=to_string_values or set(),
55
59
  parse_require=parse_require or set(),
60
+ named_type_path=named_type_path,
56
61
  )
57
62
  return orig_class
58
63
 
@@ -27,18 +27,21 @@ class _SerialUnion:
27
27
  # determine which type to parse.
28
28
  discriminator: typing.Optional[str] = None
29
29
  discriminator_map: typing.Optional[IdentityHashWrapper[dict[str, type]]] = None
30
+ named_type_path: typing.Optional[str] = None
30
31
 
31
32
 
32
33
  def serial_union_annotation(
33
34
  *,
34
35
  discriminator: typing.Optional[str] = None,
35
36
  discriminator_map: typing.Optional[dict[str, type]] = None,
37
+ named_type_path: typing.Optional[str] = None,
36
38
  ) -> _SerialUnion:
37
39
  return _SerialUnion(
38
40
  discriminator=discriminator,
39
41
  discriminator_map=IdentityHashWrapper(discriminator_map)
40
42
  if discriminator_map is not None
41
43
  else None,
44
+ named_type_path=named_type_path,
42
45
  )
43
46
 
44
47
 
@@ -1159,7 +1159,8 @@ class NamespaceDataPair:
1159
1159
 
1160
1160
 
1161
1161
  class SpecBuilder:
1162
- def __init__(self, *, api_endpoints: dict[str, str]) -> None:
1162
+ def __init__(self, *, api_endpoints: dict[str, str], top_namespace: str) -> None:
1163
+ self.top_namespace = top_namespace
1163
1164
  self.where: list[str] = []
1164
1165
  self.namespaces = {}
1165
1166
  self.pending: list[NamespaceDataPair] = []
@@ -86,6 +86,7 @@ class OpenAPIConfig(BaseLanguageConfig):
86
86
 
87
87
  @dataclass(kw_only=True)
88
88
  class Config:
89
+ top_namespace: str
89
90
  type_spec_types: list[str] # folders containing the yaml type spec definitions
90
91
  api_endpoint: dict[str, str]
91
92
  # languages
@@ -130,7 +131,11 @@ def parse_yaml_config(config_file: str) -> Config:
130
131
  else None
131
132
  )
132
133
 
134
+ top_namespace = raw_config["top_namespace"]
135
+ assert isinstance(top_namespace, str)
136
+
133
137
  return Config(
138
+ top_namespace=top_namespace,
134
139
  type_spec_types=type_spec_types,
135
140
  api_endpoint=api_endpoint,
136
141
  typescript=typescript,
@@ -54,6 +54,7 @@ class TrackingContext:
54
54
  class Context(TrackingContext):
55
55
  out: io.StringIO
56
56
  namespace: builder.SpecNamespace
57
+ builder: builder.SpecBuilder
57
58
 
58
59
 
59
60
  def _resolve_namespace_name(namespace: builder.SpecNamespace) -> str:
@@ -258,6 +259,7 @@ def _emit_types(*, builder: builder.SpecBuilder, config: PythonConfig) -> None:
258
259
  ctx = Context(
259
260
  out=io.StringIO(),
260
261
  namespace=namespace,
262
+ builder=builder,
261
263
  )
262
264
 
263
265
  _emit_namespace(ctx, namespace)
@@ -753,6 +755,12 @@ def _emit_properties(
753
755
  )
754
756
 
755
757
 
758
+ def _named_type_path(ctx: Context, stype: builder.SpecTypeDefn) -> str:
759
+ parts = [] if stype.is_base else stype.namespace.path.copy()
760
+ parts.append(stype.name)
761
+ return f"{ctx.builder.top_namespace}.{".".join(parts)}"
762
+
763
+
756
764
  def _emit_type(ctx: Context, stype: builder.SpecType) -> None:
757
765
  if not isinstance(stype, builder.SpecTypeDefn):
758
766
  return
@@ -781,6 +789,9 @@ def _emit_type(ctx: Context, stype: builder.SpecType) -> None:
781
789
  ctx.out.write(f"{stype.name} = typing.Annotated[\n")
782
790
  ctx.out.write(f"{INDENT}{refer_to(ctx, stype.get_backing_type())},\n")
783
791
  ctx.out.write(f"{INDENT}serial_union_annotation(\n")
792
+ ctx.out.write(
793
+ f"{INDENT}named_type_path={util.encode_common_string(_named_type_path(ctx, stype))},\n"
794
+ )
784
795
  if stype.discriminator is not None:
785
796
  ctx.out.write(
786
797
  f"{INDENT * 2}discriminator={util.encode_common_string(stype.discriminator)},\n"
@@ -822,28 +833,27 @@ def _emit_type(ctx: Context, stype: builder.SpecType) -> None:
822
833
 
823
834
  _emit_generic(ctx, stype.get_generic())
824
835
 
825
- if (
826
- len(unconverted_values) > 0
827
- or len(to_string_values) > 0
828
- or len(unconverted_keys) > 0
829
- or len(parse_require) > 0
830
- ):
831
- ctx.use_serial_class = True
832
- ctx.out.write("@serial_class(\n")
836
+ # Emit serial_class decorator
837
+ ctx.use_serial_class = True
838
+ ctx.out.write("@serial_class(\n")
839
+ ctx.out.write(
840
+ f"{INDENT}named_type_path={util.encode_common_string(_named_type_path(ctx, stype))},\n"
841
+ )
833
842
 
834
- def write_values(key: str, values: set[str]) -> None:
835
- if len(values) == 0:
836
- return
837
- value_str = ", ".join([f'"{name}"' for name in sorted(values)])
838
- ctx.out.write(f"{INDENT}{key}={{{value_str}}},\n")
843
+ def write_values(key: str, values: set[str]) -> None:
844
+ if len(values) == 0:
845
+ return
846
+ value_str = ", ".join([f'"{name}"' for name in sorted(values)])
847
+ ctx.out.write(f"{INDENT}{key}={{{value_str}}},\n")
839
848
 
840
- write_values("unconverted_keys", unconverted_keys)
841
- write_values("unconverted_values", unconverted_values)
842
- write_values("to_string_values", to_string_values)
843
- write_values("parse_require", parse_require)
849
+ write_values("unconverted_keys", unconverted_keys)
850
+ write_values("unconverted_values", unconverted_values)
851
+ write_values("to_string_values", to_string_values)
852
+ write_values("parse_require", parse_require)
844
853
 
845
- ctx.out.write(")\n")
854
+ ctx.out.write(")\n")
846
855
 
856
+ # Emit dataclass decorator
847
857
  dataclass = "@dataclasses.dataclass"
848
858
  dc_args = []
849
859
  if stype.is_kw_only():
@@ -1275,7 +1285,9 @@ def _emit_async_batch_processor(
1275
1285
 
1276
1286
  async_batch_processor_out = io.StringIO()
1277
1287
  ctx = Context(
1278
- out=io.StringIO(), namespace=builder.SpecNamespace("async_batch_processor")
1288
+ out=io.StringIO(),
1289
+ namespace=builder.SpecNamespace("async_batch_processor"),
1290
+ builder=spec_builder,
1279
1291
  )
1280
1292
 
1281
1293
  for namespace in sorted(
@@ -1325,7 +1337,11 @@ def _emit_client_class(
1325
1337
  return
1326
1338
 
1327
1339
  client_base_out = io.StringIO()
1328
- ctx = Context(out=io.StringIO(), namespace=builder.SpecNamespace("client_base"))
1340
+ ctx = Context(
1341
+ out=io.StringIO(),
1342
+ builder=spec_builder,
1343
+ namespace=builder.SpecNamespace("client_base"),
1344
+ )
1329
1345
  for namespace in sorted(
1330
1346
  spec_builder.namespaces.values(),
1331
1347
  key=lambda ns: _resolve_namespace_name(ns),
@@ -42,7 +42,9 @@ def find_and_handle_files(
42
42
 
43
43
 
44
44
  def load_types(config: Config) -> Optional[SpecBuilder]:
45
- builder = SpecBuilder(api_endpoints=config.api_endpoint)
45
+ builder = SpecBuilder(
46
+ api_endpoints=config.api_endpoint, top_namespace=config.top_namespace
47
+ )
46
48
 
47
49
  def handle_builder_add(
48
50
  file_name: str, file_content: str, handler: Callable[[str, str, str], None]
@@ -115,4 +117,3 @@ def load_types(config: Config) -> Optional[SpecBuilder]:
115
117
  return None
116
118
 
117
119
  return builder
118
- return True
@@ -65,7 +65,7 @@ class ClientConfig(ClientConfigOptions):
65
65
  OAUTH_REFRESH_WINDOW_SECONDS = 60 * 5
66
66
 
67
67
 
68
- class APIResponseError(BaseException):
68
+ class APIResponseError(Exception):
69
69
  status_code: int
70
70
  message: str
71
71
  extra_details: dict[str, JsonValue] | None
@@ -107,7 +107,7 @@ class APIResponseError(BaseException):
107
107
  )
108
108
 
109
109
 
110
- class SDKError(BaseException):
110
+ class SDKError(Exception):
111
111
  message: str
112
112
  request_id: str
113
113
 
@@ -0,0 +1,49 @@
1
+ import argparse
2
+
3
+ from opentelemetry.trace import get_current_span
4
+
5
+ from uncountable.core.environment import get_local_admin_server_port
6
+ from uncountable.integration.queue_runner.command_server.command_client import (
7
+ send_job_queue_message,
8
+ )
9
+ from uncountable.integration.telemetry import Logger
10
+ from uncountable.types import queued_job_t
11
+
12
+
13
+ def main() -> None:
14
+ logger = Logger(get_current_span())
15
+
16
+ parser = argparse.ArgumentParser(
17
+ description="Process a job with a given command and job ID."
18
+ )
19
+
20
+ parser.add_argument(
21
+ "command",
22
+ type=str,
23
+ choices=["run"],
24
+ help="The command to execute (e.g., 'run')",
25
+ )
26
+
27
+ parser.add_argument("job_id", type=str, help="The ID of the job to process")
28
+
29
+ parser.add_argument(
30
+ "--host", type=str, default="localhost", nargs="?", help="The host to run on"
31
+ )
32
+
33
+ args = parser.parse_args()
34
+
35
+ with logger.push_scope(args.command):
36
+ if args.command == "run":
37
+ send_job_queue_message(
38
+ job_ref_name=args.job_id,
39
+ payload=queued_job_t.QueuedJobPayload(
40
+ invocation_context=queued_job_t.InvocationContextManual()
41
+ ),
42
+ host=args.host,
43
+ port=get_local_admin_server_port(),
44
+ )
45
+ else:
46
+ parser.print_usage()
47
+
48
+
49
+ main()
@@ -0,0 +1,13 @@
1
+ from uncountable.integration.db.connect import IntegrationDBService, create_db_engine
2
+ from uncountable.integration.scan_profiles import load_profiles
3
+ from uncountable.integration.server import IntegrationServer
4
+
5
+
6
+ def main() -> None:
7
+ with IntegrationServer(create_db_engine(IntegrationDBService.CRON)) as server:
8
+ server.register_jobs(load_profiles())
9
+ server.serve_forever()
10
+
11
+
12
+ if __name__ == "__main__":
13
+ main()
@@ -102,8 +102,12 @@ def run_queued_job(
102
102
  payload=payload,
103
103
  )
104
104
 
105
- return execute_job(
106
- args=args,
107
- profile_metadata=job_details.profile_metadata,
108
- job_definition=job_details.job_definition,
109
- )
105
+ try:
106
+ return execute_job(
107
+ args=args,
108
+ profile_metadata=job_details.profile_metadata,
109
+ job_definition=job_details.job_definition,
110
+ )
111
+ except Exception as e:
112
+ job_logger.log_exception(e)
113
+ return job_definition_t.JobResult(success=False)
@@ -0,0 +1,125 @@
1
+ import signal
2
+ from dataclasses import asdict
3
+ from types import TracebackType
4
+ from typing import Optional, assert_never
5
+
6
+ from apscheduler.executors.pool import ThreadPoolExecutor
7
+ from apscheduler.jobstores.sqlalchemy import SQLAlchemyJobStore
8
+ from apscheduler.schedulers.background import BackgroundScheduler
9
+ from apscheduler.schedulers.base import BaseScheduler
10
+ from apscheduler.triggers.cron import CronTrigger
11
+ from opentelemetry.trace import get_current_span
12
+ from sqlalchemy.engine.base import Engine
13
+
14
+ from uncountable.integration.cron import CronJobArgs, cron_job_executor
15
+ from uncountable.integration.scan_profiles import ProfileDetails
16
+ from uncountable.integration.telemetry import Logger
17
+ from uncountable.types import base_t
18
+ from uncountable.types.job_definition_t import (
19
+ CronJobDefinition,
20
+ ProfileMetadata,
21
+ WebhookJobDefinition,
22
+ )
23
+
24
+ _MAX_APSCHEDULER_CONCURRENT_JOBS = 1
25
+
26
+
27
+ class IntegrationServer:
28
+ _scheduler: BaseScheduler
29
+ _engine: Engine
30
+ _server_logger: Logger
31
+
32
+ def __init__(self, engine: Engine) -> None:
33
+ self._engine = engine
34
+ self._scheduler = BackgroundScheduler(
35
+ timezone="UTC",
36
+ jobstores={"default": SQLAlchemyJobStore(engine=engine)},
37
+ executors={"default": ThreadPoolExecutor(_MAX_APSCHEDULER_CONCURRENT_JOBS)},
38
+ )
39
+ self._server_logger = Logger(get_current_span())
40
+
41
+ def register_jobs(self, profiles: list[ProfileDetails]) -> None:
42
+ valid_job_ids = []
43
+ for profile in profiles:
44
+ for job_defn in profile.definition.jobs:
45
+ valid_job_ids.append(job_defn.id)
46
+ profile_metadata = ProfileMetadata(
47
+ name=profile.name,
48
+ auth_retrieval=profile.definition.auth_retrieval,
49
+ base_url=profile.definition.base_url,
50
+ client_options=profile.definition.client_options,
51
+ )
52
+ match job_defn:
53
+ case CronJobDefinition():
54
+ # Add to ap scheduler
55
+ job_kwargs = asdict(
56
+ CronJobArgs(
57
+ definition=job_defn, profile_metadata=profile_metadata
58
+ )
59
+ )
60
+ try:
61
+ existing_job = self._scheduler.get_job(job_defn.id)
62
+ except ValueError as e:
63
+ self._server_logger.log_warning(
64
+ f"could not reconstitute job {job_defn.id}: {e}"
65
+ )
66
+ self._scheduler.remove_job(job_defn.id)
67
+ existing_job = None
68
+ if existing_job is not None:
69
+ existing_job.modify(
70
+ name=job_defn.name,
71
+ kwargs=job_kwargs,
72
+ misfire_grace_time=None,
73
+ )
74
+ existing_job.reschedule(
75
+ CronTrigger.from_crontab(job_defn.cron_spec)
76
+ )
77
+ if not job_defn.enabled:
78
+ existing_job.pause()
79
+ else:
80
+ existing_job.resume()
81
+ else:
82
+ job_opts: dict[str, base_t.JsonValue] = {}
83
+ if not job_defn.enabled:
84
+ job_opts["next_run_time"] = None
85
+ self._scheduler.add_job(
86
+ cron_job_executor,
87
+ # IMPROVE: reconsider these defaults
88
+ max_instances=1,
89
+ coalesce=True,
90
+ trigger=CronTrigger.from_crontab(job_defn.cron_spec),
91
+ name=job_defn.name,
92
+ id=job_defn.id,
93
+ kwargs=job_kwargs,
94
+ misfire_grace_time=None,
95
+ **job_opts,
96
+ )
97
+ case WebhookJobDefinition():
98
+ pass
99
+ case _:
100
+ assert_never(job_defn)
101
+ all_jobs = self._scheduler.get_jobs()
102
+ for job in all_jobs:
103
+ if job.id not in valid_job_ids:
104
+ self._scheduler.remove_job(job.id)
105
+
106
+ def serve_forever(self) -> None:
107
+ signal.pause()
108
+
109
+ def _start_apscheduler(self) -> None:
110
+ self._scheduler.start()
111
+
112
+ def _stop_apscheduler(self) -> None:
113
+ self._scheduler.shutdown()
114
+
115
+ def __enter__(self) -> "IntegrationServer":
116
+ self._start_apscheduler()
117
+ return self
118
+
119
+ def __exit__(
120
+ self,
121
+ exc_type: Optional[type[BaseException]],
122
+ exc_val: Optional[BaseException],
123
+ exc_tb: Optional[TracebackType],
124
+ ) -> None:
125
+ self._stop_apscheduler()
@@ -41,6 +41,7 @@ class RequestMethod(StrEnum):
41
41
 
42
42
  # DO NOT MODIFY -- This file is generated by type_spec
43
43
  @serial_class(
44
+ named_type_path="sdk.api.batch.execute_batch.BatchRequest",
44
45
  unconverted_values={"data"},
45
46
  )
46
47
  @dataclasses.dataclass(kw_only=True)
@@ -51,6 +52,9 @@ class BatchRequest:
51
52
 
52
53
 
53
54
  # DO NOT MODIFY -- This file is generated by type_spec
55
+ @serial_class(
56
+ named_type_path="sdk.api.batch.execute_batch.Arguments",
57
+ )
54
58
  @dataclasses.dataclass(kw_only=True)
55
59
  class Arguments:
56
60
  requests: list[BatchRequest]
@@ -58,6 +62,7 @@ class Arguments:
58
62
 
59
63
  # DO NOT MODIFY -- This file is generated by type_spec
60
64
  @serial_class(
65
+ named_type_path="sdk.api.batch.execute_batch.BatchResponse",
61
66
  unconverted_values={"response"},
62
67
  )
63
68
  @dataclasses.dataclass(kw_only=True)
@@ -69,6 +74,9 @@ class BatchResponse:
69
74
 
70
75
 
71
76
  # DO NOT MODIFY -- This file is generated by type_spec
77
+ @serial_class(
78
+ named_type_path="sdk.api.batch.execute_batch.Data",
79
+ )
72
80
  @dataclasses.dataclass(kw_only=True)
73
81
  class Data:
74
82
  responses: list[BatchResponse]
@@ -8,6 +8,7 @@ import typing # noqa: F401
8
8
  import datetime # noqa: F401
9
9
  from decimal import Decimal # noqa: F401
10
10
  import dataclasses
11
+ from pkgs.serialization import serial_class
11
12
  from ... import async_batch_t
12
13
  from ... import base_t
13
14
 
@@ -23,12 +24,18 @@ ENDPOINT_PATH = "api/external/batch/execute_batch_load_async"
23
24
 
24
25
 
25
26
  # DO NOT MODIFY -- This file is generated by type_spec
27
+ @serial_class(
28
+ named_type_path="sdk.api.batch.execute_batch_load_async.Arguments",
29
+ )
26
30
  @dataclasses.dataclass(kw_only=True)
27
31
  class Arguments:
28
32
  requests: list[async_batch_t.AsyncBatchRequest]
29
33
 
30
34
 
31
35
  # DO NOT MODIFY -- This file is generated by type_spec
36
+ @serial_class(
37
+ named_type_path="sdk.api.batch.execute_batch_load_async.Data",
38
+ )
32
39
  @dataclasses.dataclass(kw_only=True)
33
40
  class Data:
34
41
  job_id: base_t.ObjectId
@@ -25,12 +25,18 @@ ENDPOINT_PATH = "api/external/chemical/convert_chemical_formats"
25
25
 
26
26
 
27
27
  # DO NOT MODIFY -- This file is generated by type_spec
28
+ @serial_class(
29
+ named_type_path="sdk.api.chemical.convert_chemical_formats.ChemicalStructureFile",
30
+ )
28
31
  @dataclasses.dataclass(kw_only=True)
29
32
  class ChemicalStructureFile:
30
33
  struct_file: str
31
34
 
32
35
 
33
36
  # DO NOT MODIFY -- This file is generated by type_spec
37
+ @serial_class(
38
+ named_type_path="sdk.api.chemical.convert_chemical_formats.Arguments",
39
+ )
34
40
  @dataclasses.dataclass(kw_only=True)
35
41
  class Arguments:
36
42
  source_chemical_structures: list[ChemicalStructureFile]
@@ -42,6 +48,7 @@ UncountableChemicalStructure = dict[str, base_t.JsonValue]
42
48
 
43
49
  # DO NOT MODIFY -- This file is generated by type_spec
44
50
  @serial_class(
51
+ named_type_path="sdk.api.chemical.convert_chemical_formats.Data",
45
52
  unconverted_values={"chemical_structures"},
46
53
  )
47
54
  @dataclasses.dataclass(kw_only=True)
@@ -8,6 +8,7 @@ import typing # noqa: F401
8
8
  import datetime # noqa: F401
9
9
  from decimal import Decimal # noqa: F401
10
10
  import dataclasses
11
+ from pkgs.serialization import serial_class
11
12
  from ... import base_t
12
13
  from ... import entity_t
13
14
  from ... import field_values_t
@@ -25,20 +26,29 @@ ENDPOINT_PATH = "api/external/entity/external_create_entities"
25
26
 
26
27
 
27
28
  # DO NOT MODIFY -- This file is generated by type_spec
29
+ @serial_class(
30
+ named_type_path="sdk.api.entity.create_entities.EntityToCreate",
31
+ )
28
32
  @dataclasses.dataclass(kw_only=True)
29
33
  class EntityToCreate:
30
34
  field_values: typing.Optional[typing.Optional[list[field_values_t.FieldRefNameValue]]] = None
31
35
 
32
36
 
33
37
  # DO NOT MODIFY -- This file is generated by type_spec
38
+ @serial_class(
39
+ named_type_path="sdk.api.entity.create_entities.Arguments",
40
+ )
34
41
  @dataclasses.dataclass(kw_only=True)
35
42
  class Arguments:
36
43
  definition_id: base_t.ObjectId
37
- entity_type: typing.Union[typing.Literal[entity_t.EntityType.LAB_REQUEST], typing.Literal[entity_t.EntityType.APPROVAL], typing.Literal[entity_t.EntityType.CUSTOM_ENTITY], typing.Literal[entity_t.EntityType.INVENTORY_AMOUNT], typing.Literal[entity_t.EntityType.TASK], typing.Literal[entity_t.EntityType.PROJECT], typing.Literal[entity_t.EntityType.EQUIPMENT], typing.Literal[entity_t.EntityType.INV_LOCAL_LOCATIONS], typing.Literal[entity_t.EntityType.FIELD_OPTION_SET], typing.Literal[entity_t.EntityType.WEBHOOK], typing.Literal[entity_t.EntityType.SPECS], typing.Literal[entity_t.EntityType.GOAL], typing.Literal[entity_t.EntityType.INGREDIENT_TAG_MAP], typing.Literal[entity_t.EntityType.INGREDIENT_TAG]]
44
+ entity_type: typing.Union[typing.Literal[entity_t.EntityType.LAB_REQUEST], typing.Literal[entity_t.EntityType.APPROVAL], typing.Literal[entity_t.EntityType.CUSTOM_ENTITY], typing.Literal[entity_t.EntityType.INVENTORY_AMOUNT], typing.Literal[entity_t.EntityType.TASK], typing.Literal[entity_t.EntityType.PROJECT], typing.Literal[entity_t.EntityType.EQUIPMENT], typing.Literal[entity_t.EntityType.INV_LOCAL_LOCATIONS], typing.Literal[entity_t.EntityType.FIELD_OPTION_SET], typing.Literal[entity_t.EntityType.WEBHOOK], typing.Literal[entity_t.EntityType.SPECS], typing.Literal[entity_t.EntityType.GOAL], typing.Literal[entity_t.EntityType.INGREDIENT_TAG_MAP], typing.Literal[entity_t.EntityType.INGREDIENT_TAG], typing.Literal[entity_t.EntityType.OUTPUT]]
38
45
  entities_to_create: list[EntityToCreate]
39
46
 
40
47
 
41
48
  # DO NOT MODIFY -- This file is generated by type_spec
49
+ @serial_class(
50
+ named_type_path="sdk.api.entity.create_entities.Data",
51
+ )
42
52
  @dataclasses.dataclass(kw_only=True)
43
53
  class Data:
44
54
  entities: list[entity_t.Entity]
@@ -27,6 +27,7 @@ ENDPOINT_PATH = "api/external/entity/external_create_entity"
27
27
 
28
28
  # DO NOT MODIFY -- This file is generated by type_spec
29
29
  @serial_class(
30
+ named_type_path="sdk.api.entity.create_entity.EntityFieldInitialValue",
30
31
  unconverted_values={"value"},
31
32
  )
32
33
  @dataclasses.dataclass(kw_only=True)
@@ -37,14 +38,20 @@ class EntityFieldInitialValue:
37
38
 
38
39
 
39
40
  # DO NOT MODIFY -- This file is generated by type_spec
41
+ @serial_class(
42
+ named_type_path="sdk.api.entity.create_entity.Arguments",
43
+ )
40
44
  @dataclasses.dataclass(kw_only=True)
41
45
  class Arguments:
42
46
  definition_id: base_t.ObjectId
43
- entity_type: typing.Union[typing.Literal[entity_t.EntityType.LAB_REQUEST], typing.Literal[entity_t.EntityType.APPROVAL], typing.Literal[entity_t.EntityType.CUSTOM_ENTITY], typing.Literal[entity_t.EntityType.INVENTORY_AMOUNT], typing.Literal[entity_t.EntityType.TASK], typing.Literal[entity_t.EntityType.PROJECT], typing.Literal[entity_t.EntityType.EQUIPMENT], typing.Literal[entity_t.EntityType.INV_LOCAL_LOCATIONS], typing.Literal[entity_t.EntityType.FIELD_OPTION_SET], typing.Literal[entity_t.EntityType.WEBHOOK], typing.Literal[entity_t.EntityType.SPECS], typing.Literal[entity_t.EntityType.GOAL], typing.Literal[entity_t.EntityType.INGREDIENT_TAG_MAP], typing.Literal[entity_t.EntityType.INGREDIENT_TAG]]
47
+ entity_type: typing.Union[typing.Literal[entity_t.EntityType.LAB_REQUEST], typing.Literal[entity_t.EntityType.APPROVAL], typing.Literal[entity_t.EntityType.CUSTOM_ENTITY], typing.Literal[entity_t.EntityType.INVENTORY_AMOUNT], typing.Literal[entity_t.EntityType.TASK], typing.Literal[entity_t.EntityType.PROJECT], typing.Literal[entity_t.EntityType.EQUIPMENT], typing.Literal[entity_t.EntityType.INV_LOCAL_LOCATIONS], typing.Literal[entity_t.EntityType.FIELD_OPTION_SET], typing.Literal[entity_t.EntityType.WEBHOOK], typing.Literal[entity_t.EntityType.SPECS], typing.Literal[entity_t.EntityType.GOAL], typing.Literal[entity_t.EntityType.INGREDIENT_TAG_MAP], typing.Literal[entity_t.EntityType.INGREDIENT_TAG], typing.Literal[entity_t.EntityType.OUTPUT]]
44
48
  field_values: typing.Optional[typing.Optional[list[field_values_t.FieldRefNameValue]]] = None
45
49
 
46
50
 
47
51
  # DO NOT MODIFY -- This file is generated by type_spec
52
+ @serial_class(
53
+ named_type_path="sdk.api.entity.create_entity.Data",
54
+ )
48
55
  @dataclasses.dataclass(kw_only=True)
49
56
  class Data:
50
57
  entity: entity_t.Entity