UncountablePythonSDK 0.0.168__tar.gz → 0.0.170__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 (413) hide show
  1. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/.github/workflows/documentation.yml +2 -2
  2. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/PKG-INFO +1 -1
  3. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/UncountablePythonSDK.egg-info/PKG-INFO +1 -1
  4. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/examples/integration-server/jobs/materials_auto/example_instrument.py +1 -1
  5. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/examples/integration-server/pyproject.toml +2 -2
  6. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/pkgs/serialization_util/serialization_helpers.py +1 -1
  7. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/pkgs/type_spec/emit_python.py +2 -9
  8. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/pkgs/type_spec/parts/base.py.prepart +0 -4
  9. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/pkgs/type_spec/type_info/emit_type_info.py +14 -5
  10. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/pkgs/type_spec/value_spec/__main__.py +2 -6
  11. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/pkgs/type_spec/value_spec/emit_python.py +1 -1
  12. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/integration/queue_runner/command_server/command_client.py +3 -3
  13. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/integration/telemetry.py +40 -45
  14. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/api/batch/execute_batch.py +4 -4
  15. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/api/batch/execute_batch_load_async.py +2 -2
  16. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/api/chemical/convert_chemical_formats.py +3 -3
  17. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/api/condition_parameters/upsert_condition_match.py +3 -4
  18. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/api/condition_parameters/upsert_condition_matches.py +8 -9
  19. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/api/entity/create_entities.py +3 -3
  20. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/api/entity/create_entity.py +3 -3
  21. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/api/entity/create_or_update_entity.py +2 -3
  22. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/api/entity/export_entities.py +3 -3
  23. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/api/entity/get_entities_data.py +3 -3
  24. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/api/entity/grant_entity_permissions.py +2 -3
  25. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/api/entity/list_aggregate.py +5 -5
  26. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/api/entity/list_entities.py +6 -6
  27. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/api/entity/lock_entity.py +2 -3
  28. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/api/entity/lookup_entity.py +6 -6
  29. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/api/entity/resolve_entity_ids.py +3 -3
  30. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/api/entity/set_barcode.py +2 -3
  31. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/api/entity/set_entity_field_values.py +2 -3
  32. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/api/entity/set_values.py +2 -3
  33. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/api/entity/transition_entity_phase.py +4 -5
  34. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/api/entity/unlock_entity.py +2 -3
  35. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/api/equipment/associate_equipment_input.py +2 -2
  36. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/api/field_options/upsert_field_options.py +3 -4
  37. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/api/file_folders/add_file_to_folder.py +2 -2
  38. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/api/file_folders/modify_file_system.py +3 -4
  39. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/api/files/download_file.py +4 -4
  40. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/api/id_source/list_id_source.py +3 -3
  41. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/api/id_source/match_id_source.py +3 -3
  42. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/api/input_groups/get_input_group_names.py +3 -3
  43. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/api/inputs/create_inputs.py +6 -5
  44. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/api/inputs/get_input_data.py +6 -6
  45. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/api/inputs/get_input_names.py +3 -3
  46. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/api/inputs/get_inputs_data.py +6 -6
  47. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/api/inputs/set_input_attribute_values.py +3 -3
  48. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/api/inputs/set_input_category.py +2 -3
  49. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/api/inputs/set_input_subcategories.py +2 -3
  50. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/api/inputs/set_intermediate_type.py +2 -3
  51. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/api/integrations/publish_realtime_data.py +3 -4
  52. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/api/integrations/push_notification.py +2 -3
  53. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/api/integrations/register_sockets_token.py +2 -3
  54. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/api/listing/export_listing.py +2 -3
  55. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/api/listing/fetch_listing.py +3 -3
  56. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/api/material_families/update_entity_material_families.py +2 -2
  57. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/api/notebooks/add_notebook_content.py +20 -20
  58. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/api/notebooks/get_notebook_content.py +14 -15
  59. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/api/output_parameters/swap_output_condition_parameters.py +7 -8
  60. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/api/outputs/get_output_data.py +6 -6
  61. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/api/outputs/get_output_names.py +3 -3
  62. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/api/outputs/get_output_organization.py +9 -9
  63. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/api/outputs/resolve_output_conditions.py +5 -5
  64. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/api/outputs/update_output_condition_parameter.py +2 -3
  65. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/api/permissions/set_core_permissions.py +6 -7
  66. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/api/permissions/set_entity_permission.py +4 -5
  67. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/api/project/get_projects.py +3 -3
  68. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/api/project/get_projects_data.py +3 -3
  69. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/api/recipe_links/create_recipe_link.py +2 -3
  70. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/api/recipe_links/remove_recipe_link.py +2 -3
  71. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/api/recipe_metadata/get_recipe_metadata_data.py +3 -3
  72. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/api/recipes/add_recipe_to_project.py +2 -3
  73. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/api/recipes/add_time_series_data.py +3 -4
  74. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/api/recipes/archive_recipes.py +2 -3
  75. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/api/recipes/associate_recipe_as_input.py +2 -3
  76. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/api/recipes/associate_recipe_as_lot.py +2 -3
  77. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/api/recipes/clear_recipe_outputs.py +2 -3
  78. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/api/recipes/create_mix_order.py +2 -3
  79. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/api/recipes/create_recipe.py +2 -2
  80. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/api/recipes/create_recipes.py +4 -4
  81. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/api/recipes/disassociate_recipe_as_input.py +2 -3
  82. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/api/recipes/edit_recipe_inputs.py +20 -21
  83. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/api/recipes/get_column_calculation_values.py +3 -3
  84. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/api/recipes/get_curve.py +2 -2
  85. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/api/recipes/get_recipe_calculations.py +3 -3
  86. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/api/recipes/get_recipe_links.py +2 -2
  87. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/api/recipes/get_recipe_names.py +3 -3
  88. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/api/recipes/get_recipe_output_metadata.py +3 -3
  89. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/api/recipes/get_recipes_data.py +13 -13
  90. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/api/recipes/lock_recipes.py +3 -4
  91. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/api/recipes/remove_recipe_from_project.py +2 -3
  92. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/api/recipes/set_recipe_inputs.py +3 -3
  93. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/api/recipes/set_recipe_metadata.py +2 -3
  94. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/api/recipes/set_recipe_output_annotations.py +6 -6
  95. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/api/recipes/set_recipe_output_file.py +3 -3
  96. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/api/recipes/set_recipe_outputs.py +4 -4
  97. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/api/recipes/set_recipe_tags.py +6 -6
  98. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/api/recipes/set_recipe_total.py +3 -4
  99. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/api/recipes/unarchive_recipes.py +2 -3
  100. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/api/recipes/unlock_recipes.py +2 -3
  101. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/api/recipes/upsert_recipe_workflow_step.py +2 -3
  102. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/api/recipes/upsert_step_relationships.py +4 -5
  103. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/api/runsheet/complete_async_upload.py +2 -2
  104. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/api/runsheet/export_default_runsheet.py +2 -2
  105. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/api/triggers/run_trigger.py +2 -3
  106. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/api/uploader/complete_async_parse.py +2 -2
  107. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/api/uploader/invoke_uploader.py +2 -2
  108. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/api/user/get_current_user_info.py +2 -2
  109. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/async_batch_t.py +5 -5
  110. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/async_jobs_t.py +4 -0
  111. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/auth_retrieval_t.py +3 -4
  112. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/base_t.py +0 -4
  113. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/calculations_t.py +1 -1
  114. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/chemical_structure_t.py +1 -2
  115. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/client_config_t.py +4 -4
  116. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/curves_t.py +2 -2
  117. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/data_t.py +4 -5
  118. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/entity_t.py +2 -2
  119. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/experiment_groups_t.py +1 -1
  120. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/exports_t.py +1 -2
  121. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/field_values_t.py +20 -20
  122. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/fields_t.py +1 -1
  123. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/generic_upload_t.py +6 -7
  124. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/id_source_t.py +4 -5
  125. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/identifier_t.py +3 -3
  126. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/input_attributes_t.py +1 -1
  127. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/inputs_t.py +1 -1
  128. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/integration_server_t.py +1 -2
  129. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/integration_session_t.py +2 -3
  130. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/integrations_t.py +2 -3
  131. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/job_definition_t.py +15 -16
  132. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/listing_t.py +29 -29
  133. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/notices_t.py +1 -2
  134. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/notifications_t.py +3 -4
  135. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/outputs_t.py +1 -1
  136. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/overrides_t.py +2 -3
  137. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/phases_t.py +1 -1
  138. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/queued_job_t.py +8 -8
  139. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/recipe_identifiers_t.py +3 -3
  140. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/recipe_links_t.py +1 -1
  141. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/recipe_metadata_t.py +3 -3
  142. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/recipe_output_metadata_t.py +1 -1
  143. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/recipe_tags_t.py +1 -1
  144. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/recipe_workflow_step_types_t.py +5 -6
  145. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/recipe_workflow_steps_t.py +4 -5
  146. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/recipes_t.py +1 -2
  147. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/response_t.py +1 -2
  148. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/runsheet_format_t.py +3 -4
  149. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/runsheet_t.py +10 -11
  150. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/secret_retrieval_t.py +3 -4
  151. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/sockets_t.py +8 -8
  152. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/step_relationships_t.py +7 -8
  153. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/units_t.py +1 -1
  154. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/uploader_t.py +12 -13
  155. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/users_t.py +1 -1
  156. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/webhook_job_t.py +3 -3
  157. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/workflows_t.py +2 -2
  158. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/.github/workflows/publish.yml +0 -0
  159. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/.gitignore +0 -0
  160. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/.python-version +0 -0
  161. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/README.md +0 -0
  162. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/UncountablePythonSDK.egg-info/SOURCES.txt +0 -0
  163. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/UncountablePythonSDK.egg-info/dependency_links.txt +0 -0
  164. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/UncountablePythonSDK.egg-info/requires.txt +0 -0
  165. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/UncountablePythonSDK.egg-info/top_level.txt +0 -0
  166. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/docs/.gitignore +0 -0
  167. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/docs/conf.py +0 -0
  168. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/docs/index.md +0 -0
  169. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/docs/integration_examples/add_file_to_folder.md +0 -0
  170. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/docs/integration_examples/create_ingredient.md +0 -0
  171. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/docs/integration_examples/create_output.md +0 -0
  172. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/docs/integration_examples/index.md +0 -0
  173. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/docs/integration_examples/upload_file.md +0 -0
  174. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/docs/justfile +0 -0
  175. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/docs/requirements.txt +0 -0
  176. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/docs/static/favicons/android-chrome-192x192.png +0 -0
  177. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/docs/static/favicons/android-chrome-512x512.png +0 -0
  178. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/docs/static/favicons/apple-touch-icon.png +0 -0
  179. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/docs/static/favicons/browserconfig.xml +0 -0
  180. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/docs/static/favicons/favicon-16x16.png +0 -0
  181. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/docs/static/favicons/favicon-32x32.png +0 -0
  182. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/docs/static/favicons/manifest.json +0 -0
  183. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/docs/static/favicons/mstile-150x150.png +0 -0
  184. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/docs/static/favicons/safari-pinned-tab.svg +0 -0
  185. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/docs/static/logo_blue.png +0 -0
  186. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/examples/async_batch.py +0 -0
  187. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/examples/async_batch_large_parse.py +0 -0
  188. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/examples/basic_auth.py +0 -0
  189. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/examples/create_entity.py +0 -0
  190. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/examples/create_ingredient_sdk.py +0 -0
  191. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/examples/download_files.py +0 -0
  192. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/examples/edit_recipe_inputs.py +0 -0
  193. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/examples/integration-server/jobs/materials_auto/concurrent_cron.py +0 -0
  194. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/examples/integration-server/jobs/materials_auto/example_cron.py +0 -0
  195. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/examples/integration-server/jobs/materials_auto/example_http.py +0 -0
  196. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/examples/integration-server/jobs/materials_auto/example_parse.py +0 -0
  197. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/examples/integration-server/jobs/materials_auto/example_predictions.py +0 -0
  198. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/examples/integration-server/jobs/materials_auto/example_runsheet_wh.py +0 -0
  199. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/examples/integration-server/jobs/materials_auto/example_wh.py +0 -0
  200. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/examples/integration-server/jobs/materials_auto/profile.yaml +0 -0
  201. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/examples/invoke_uploader.py +0 -0
  202. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/examples/oauth.py +0 -0
  203. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/examples/set_input_pdf_attribute.py +0 -0
  204. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/examples/set_recipe_metadata_file.py +0 -0
  205. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/examples/set_recipe_output_file_sdk.py +0 -0
  206. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/examples/upload_files.py +0 -0
  207. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/pkgs/__init__.py +0 -0
  208. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/pkgs/argument_parser/__init__.py +0 -0
  209. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/pkgs/argument_parser/_is_enum.py +0 -0
  210. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/pkgs/argument_parser/_is_namedtuple.py +0 -0
  211. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/pkgs/argument_parser/argument_parser.py +0 -0
  212. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/pkgs/argument_parser/case_convert.py +0 -0
  213. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/pkgs/argument_parser/parser_error.py +0 -0
  214. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/pkgs/filesystem_utils/__init__.py +0 -0
  215. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/pkgs/filesystem_utils/_blob_session.py +0 -0
  216. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/pkgs/filesystem_utils/_file_share_session.py +0 -0
  217. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/pkgs/filesystem_utils/_gdrive_session.py +0 -0
  218. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/pkgs/filesystem_utils/_local_session.py +0 -0
  219. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/pkgs/filesystem_utils/_s3_session.py +0 -0
  220. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/pkgs/filesystem_utils/_sftp_session.py +0 -0
  221. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/pkgs/filesystem_utils/file_type_utils.py +0 -0
  222. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/pkgs/filesystem_utils/filesystem_session.py +0 -0
  223. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/pkgs/py.typed +0 -0
  224. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/pkgs/serialization/__init__.py +0 -0
  225. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/pkgs/serialization/annotation.py +0 -0
  226. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/pkgs/serialization/missing_sentry.py +0 -0
  227. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/pkgs/serialization/opaque_key.py +0 -0
  228. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/pkgs/serialization/serial_alias.py +0 -0
  229. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/pkgs/serialization/serial_class.py +0 -0
  230. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/pkgs/serialization/serial_generic.py +0 -0
  231. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/pkgs/serialization/serial_union.py +0 -0
  232. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/pkgs/serialization/unknown.py +0 -0
  233. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/pkgs/serialization/yaml.py +0 -0
  234. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/pkgs/serialization_util/__init__.py +0 -0
  235. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/pkgs/serialization_util/_get_type_for_serialization.py +0 -0
  236. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/pkgs/serialization_util/convert_to_snakecase.py +0 -0
  237. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/pkgs/serialization_util/dataclasses.py +0 -0
  238. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/pkgs/strenum_compat/__init__.py +0 -0
  239. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/pkgs/strenum_compat/strenum_compat.py +0 -0
  240. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/pkgs/type_spec/__init__.py +0 -0
  241. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/pkgs/type_spec/__main__.py +0 -0
  242. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/pkgs/type_spec/actions_registry/__init__.py +0 -0
  243. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/pkgs/type_spec/actions_registry/__main__.py +0 -0
  244. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/pkgs/type_spec/actions_registry/emit_typescript.py +0 -0
  245. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/pkgs/type_spec/builder.py +0 -0
  246. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/pkgs/type_spec/builder_types.py +0 -0
  247. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/pkgs/type_spec/config.py +0 -0
  248. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/pkgs/type_spec/cross_output_links.py +0 -0
  249. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/pkgs/type_spec/emit_io_ts.py +0 -0
  250. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/pkgs/type_spec/emit_open_api.py +0 -0
  251. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/pkgs/type_spec/emit_open_api_util.py +0 -0
  252. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/pkgs/type_spec/emit_typescript.py +0 -0
  253. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/pkgs/type_spec/emit_typescript_util.py +0 -0
  254. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/pkgs/type_spec/load_types.py +0 -0
  255. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/pkgs/type_spec/non_discriminated_union_exceptions.py +0 -0
  256. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/pkgs/type_spec/open_api_util.py +0 -0
  257. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/pkgs/type_spec/parts/base.ts.prepart +0 -0
  258. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/pkgs/type_spec/test.py +0 -0
  259. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/pkgs/type_spec/type_info/__main__.py +0 -0
  260. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/pkgs/type_spec/ui_entry_actions/__init__.py +0 -0
  261. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/pkgs/type_spec/ui_entry_actions/generate_ui_entry_actions.py +0 -0
  262. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/pkgs/type_spec/util.py +0 -0
  263. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/pkgs/type_spec/value_spec/__init__.py +0 -0
  264. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/pkgs/type_spec/value_spec/convert_type.py +0 -0
  265. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/pkgs/type_spec/value_spec/types.py +0 -0
  266. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/pyproject.toml +0 -0
  267. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/setup.cfg +0 -0
  268. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/__init__.py +0 -0
  269. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/core/__init__.py +0 -0
  270. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/core/async_batch.py +0 -0
  271. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/core/client.py +0 -0
  272. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/core/environment.py +0 -0
  273. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/core/file_upload.py +0 -0
  274. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/core/query/__init__.py +0 -0
  275. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/core/query/builder.py +0 -0
  276. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/core/query/column.py +0 -0
  277. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/core/query/row.py +0 -0
  278. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/core/query/types.py +0 -0
  279. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/core/types.py +0 -0
  280. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/integration/__init__.py +0 -0
  281. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/integration/cli.py +0 -0
  282. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/integration/construct_client.py +0 -0
  283. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/integration/cron.py +0 -0
  284. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/integration/db/__init__.py +0 -0
  285. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/integration/db/connect.py +0 -0
  286. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/integration/db/session.py +0 -0
  287. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/integration/entrypoint.py +0 -0
  288. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/integration/executors/__init__.py +0 -0
  289. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/integration/executors/executors.py +0 -0
  290. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/integration/executors/generic_upload_executor.py +0 -0
  291. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/integration/executors/script_executor.py +0 -0
  292. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/integration/http_server/__init__.py +0 -0
  293. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/integration/http_server/types.py +0 -0
  294. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/integration/job.py +0 -0
  295. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/integration/queue_runner/__init__.py +0 -0
  296. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/integration/queue_runner/command_server/__init__.py +0 -0
  297. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/integration/queue_runner/command_server/command_server.py +0 -0
  298. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/integration/queue_runner/command_server/constants.py +0 -0
  299. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/integration/queue_runner/command_server/protocol/__init__.py +0 -0
  300. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/integration/queue_runner/command_server/protocol/command_server.proto +0 -0
  301. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/integration/queue_runner/command_server/protocol/command_server_pb2.py +0 -0
  302. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/integration/queue_runner/command_server/protocol/command_server_pb2.pyi +0 -0
  303. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/integration/queue_runner/command_server/protocol/command_server_pb2_grpc.py +0 -0
  304. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/integration/queue_runner/command_server/types.py +0 -0
  305. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/integration/queue_runner/datastore/__init__.py +0 -0
  306. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/integration/queue_runner/datastore/datastore_sqlite.py +0 -0
  307. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/integration/queue_runner/datastore/interface.py +0 -0
  308. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/integration/queue_runner/datastore/model.py +0 -0
  309. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/integration/queue_runner/job_scheduler.py +0 -0
  310. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/integration/queue_runner/queue_runner.py +0 -0
  311. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/integration/queue_runner/types.py +0 -0
  312. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/integration/queue_runner/worker.py +0 -0
  313. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/integration/request_context.py +0 -0
  314. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/integration/scan_profiles.py +0 -0
  315. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/integration/scheduler.py +0 -0
  316. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/integration/secret_retrieval/__init__.py +0 -0
  317. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/integration/secret_retrieval/retrieve_secret.py +0 -0
  318. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/integration/server.py +0 -0
  319. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/integration/webhook_server/entrypoint.py +0 -0
  320. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/py.typed +0 -0
  321. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/__init__.py +0 -0
  322. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/api/__init__.py +0 -0
  323. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/api/batch/__init__.py +0 -0
  324. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/api/chemical/__init__.py +0 -0
  325. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/api/condition_parameters/__init__.py +0 -0
  326. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/api/entity/__init__.py +0 -0
  327. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/api/equipment/__init__.py +0 -0
  328. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/api/field_options/__init__.py +0 -0
  329. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/api/file_folders/__init__.py +0 -0
  330. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/api/files/__init__.py +0 -0
  331. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/api/id_source/__init__.py +0 -0
  332. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/api/input_groups/__init__.py +0 -0
  333. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/api/inputs/__init__.py +0 -0
  334. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/api/integrations/__init__.py +0 -0
  335. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/api/listing/__init__.py +0 -0
  336. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/api/material_families/__init__.py +0 -0
  337. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/api/notebooks/__init__.py +0 -0
  338. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/api/output_parameters/__init__.py +0 -0
  339. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/api/outputs/__init__.py +0 -0
  340. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/api/permissions/__init__.py +0 -0
  341. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/api/project/__init__.py +0 -0
  342. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/api/recipe_links/__init__.py +0 -0
  343. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/api/recipe_metadata/__init__.py +0 -0
  344. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/api/recipes/__init__.py +0 -0
  345. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/api/runsheet/__init__.py +0 -0
  346. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/api/triggers/__init__.py +0 -0
  347. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/api/uploader/__init__.py +0 -0
  348. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/api/user/__init__.py +0 -0
  349. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/async_batch.py +0 -0
  350. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/async_batch_processor.py +0 -0
  351. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/async_jobs.py +0 -0
  352. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/auth_retrieval.py +0 -0
  353. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/base.py +0 -0
  354. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/calculations.py +0 -0
  355. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/chemical_structure.py +0 -0
  356. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/client_base.py +0 -0
  357. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/client_config.py +0 -0
  358. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/condition_match.py +0 -0
  359. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/condition_match_t.py +0 -0
  360. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/curves.py +0 -0
  361. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/data.py +0 -0
  362. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/entity.py +0 -0
  363. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/experiment_groups.py +0 -0
  364. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/exports.py +0 -0
  365. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/field_values.py +0 -0
  366. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/fields.py +0 -0
  367. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/generic_upload.py +0 -0
  368. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/id_source.py +0 -0
  369. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/identifier.py +0 -0
  370. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/input_attributes.py +0 -0
  371. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/inputs.py +0 -0
  372. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/integration_server.py +0 -0
  373. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/integration_session.py +0 -0
  374. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/integrations.py +0 -0
  375. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/job_definition.py +0 -0
  376. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/listing.py +0 -0
  377. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/notices.py +0 -0
  378. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/notifications.py +0 -0
  379. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/outputs.py +0 -0
  380. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/overrides.py +0 -0
  381. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/permissions.py +0 -0
  382. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/permissions_t.py +0 -0
  383. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/phases.py +0 -0
  384. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/post_base.py +0 -0
  385. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/post_base_t.py +0 -0
  386. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/queued_job.py +0 -0
  387. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/recipe_identifiers.py +0 -0
  388. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/recipe_inputs.py +0 -0
  389. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/recipe_inputs_t.py +0 -0
  390. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/recipe_links.py +0 -0
  391. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/recipe_metadata.py +0 -0
  392. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/recipe_output_metadata.py +0 -0
  393. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/recipe_step_relationships.py +0 -0
  394. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/recipe_step_relationships_t.py +0 -0
  395. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/recipe_tags.py +0 -0
  396. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/recipe_workflow_step_types.py +0 -0
  397. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/recipe_workflow_steps.py +0 -0
  398. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/recipes.py +0 -0
  399. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/request_headers.py +0 -0
  400. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/request_headers_t.py +0 -0
  401. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/response.py +0 -0
  402. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/runsheet.py +0 -0
  403. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/runsheet_format.py +0 -0
  404. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/secret_retrieval.py +0 -0
  405. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/sockets.py +0 -0
  406. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/specs.py +0 -0
  407. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/specs_t.py +0 -0
  408. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/step_relationships.py +0 -0
  409. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/units.py +0 -0
  410. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/uploader.py +0 -0
  411. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/users.py +0 -0
  412. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/webhook_job.py +0 -0
  413. {uncountablepythonsdk-0.0.168 → uncountablepythonsdk-0.0.170}/uncountable/types/workflows.py +0 -0
@@ -11,9 +11,9 @@ jobs:
11
11
  steps:
12
12
  - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
13
13
  - uses: actions/setup-python@e797f83bcb11b83ae66e0230d6156d7c80228e7c # v6
14
- - uses: extractions/setup-crate@4993624604c307fbca528d28a3c8b60fa5ecc859 # v1
14
+ - uses: extractions/setup-crate@0551596312d4008a6dfbc4d3c38fa20eaef46d2d # v2
15
15
  with:
16
- repo: casey/just@0.10
16
+ repo: casey/just@1.50.0
17
17
  - name: Set up UV
18
18
  uses: astral-sh/setup-uv@f0ec1fc3b38f5e7cd731bb6ce540c5af426746bb
19
19
  with:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: UncountablePythonSDK
3
- Version: 0.0.168
3
+ Version: 0.0.170
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.4
2
2
  Name: UncountablePythonSDK
3
- Version: 0.0.168
3
+ Version: 0.0.170
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
@@ -29,7 +29,7 @@ class InstrumentExample(WebhookJob[InstrumentPayload]):
29
29
  self, args: JobArguments, payload: InstrumentPayload
30
30
  ) -> job_definition_t.JobResult:
31
31
  parser: CachedParser[sockets_t.SocketResponse] = CachedParser(
32
- sockets_t.SocketResponse # type:ignore[arg-type]
32
+ sockets_t.SocketResponse
33
33
  )
34
34
 
35
35
  def parse_message(message: Data) -> sockets_t.SocketEventData | None:
@@ -8,8 +8,8 @@ dependencies = [
8
8
  "mypy == 1.*",
9
9
  "ruff == 0.*",
10
10
  "openpyxl == 3.*",
11
- "more_itertools == 10.*",
12
- "types-paramiko ==4.0.0.20260322",
11
+ "more_itertools ==11.*",
12
+ "types-paramiko ==4.0.0.20260402",
13
13
  "types-openpyxl == 3.*",
14
14
  "types-pysftp == 0.*",
15
15
  "types-pytz ==2026.*",
@@ -63,7 +63,7 @@ def convert_decimals_to_strings(obj: JsonValue) -> JsonValue:
63
63
 
64
64
 
65
65
  class Dataclass(Protocol):
66
- __dataclass_fields__: ClassVar[dict] # type: ignore[type-arg,unused-ignore]
66
+ __dataclass_fields__: ClassVar[dict] # type: ignore[type-arg]
67
67
 
68
68
 
69
69
  def identity(x: T) -> T:
@@ -9,7 +9,6 @@ from .builder import (
9
9
  EndpointEmitType,
10
10
  EndpointSpecificPath,
11
11
  PropertyExtant,
12
- base_namespace_name,
13
12
  )
14
13
  from .config import PythonConfig
15
14
  from .cross_output_links import get_path_links
@@ -1016,19 +1015,13 @@ def _emit_type(ctx: Context, stype: builder.SpecType) -> None:
1016
1015
 
1017
1016
  # Emit dataclass decorator
1018
1017
  dataclass = "@dataclasses.dataclass"
1019
- refer_to(
1020
- ctx,
1021
- builder.SpecTypeDefnAlias(
1022
- namespace=ctx.builder.namespaces[base_namespace_name], name="ENABLE_SLOTS"
1023
- ),
1024
- )
1025
- dc_args = ["slots=base_t.ENABLE_SLOTS"]
1018
+ dc_args = ["slots=True"]
1026
1019
  if stype.is_kw_only():
1027
1020
  dc_args.append("kw_only=True")
1028
1021
  if stype.is_hashable:
1029
1022
  dc_args.extend(["frozen=True", "eq=True"])
1030
1023
  if len(dc_args) > 0:
1031
- dataclass += f"({', '.join(dc_args)}) # type: ignore[literal-required]"
1024
+ dataclass += f"({', '.join(dc_args)})"
1032
1025
 
1033
1026
  ctx.out.write(f"{dataclass}\n")
1034
1027
  ctx.out.write(class_out.getvalue())
@@ -30,10 +30,6 @@ REF_NAME_STRICT_REGEX = rf"{REF_NAME_STRICT_REGEX_STRING}"
30
30
  ID_REGEX = r"-?[1-9][0-9]{0,20}"
31
31
 
32
32
 
33
- # ENABLE_SLOTS should be removed after slots have been tested locally
34
- import os
35
- ENABLE_SLOTS = os.environ.get("UNC_ENABLE_DATACLASS_SLOTS") == "true"
36
-
37
33
  if TYPE_CHECKING:
38
34
  JsonValue = Union[JsonScalar, Mapping[str, "JsonValue"], Sequence["JsonValue"]]
39
35
  ExtJsonValue = JsonValue
@@ -30,6 +30,7 @@ def type_path_of(stype: builder.SpecType) -> object: # NamePath
30
30
  - Scoped Type: [ (namespace-string)..., type-string ]
31
31
  - Instance Type: [ "$instance", Scoped-Type-Base, [TypePath-Parameters...] ]
32
32
  - Literal Type: [ "$literal", [ "$value", value, value-type-string ]... ]
33
+ - Parameter Type: [ "$param", parameter-name-string ]
33
34
 
34
35
  @return (string-specific, multiple-types)
35
36
  """
@@ -71,6 +72,9 @@ def type_path_of(stype: builder.SpecType) -> object: # NamePath
71
72
  [type_path_of(parameter) for parameter in stype.parameters],
72
73
  ]
73
74
 
75
+ if isinstance(stype, builder.SpecTypeGenericParameter):
76
+ return ["$param", stype.name]
77
+
74
78
  raise Exception("unhandled-SpecType")
75
79
 
76
80
 
@@ -177,12 +181,14 @@ class MapTypeBase:
177
181
  class MapTypeObject(MapTypeBase):
178
182
  base_type_path: object
179
183
  properties: dict[OpaqueKey, MapProperty]
184
+ parameters: list[str] | None = None
180
185
 
181
186
 
182
187
  @dataclasses.dataclass
183
188
  class MapTypeAlias(MapTypeBase):
184
189
  alias_type_path: object
185
190
  discriminator: str | None
191
+ parameters: list[str] | None = None
186
192
 
187
193
 
188
194
  @dataclasses.dataclass
@@ -387,23 +393,28 @@ def _validate_type_ext_info(
387
393
  def _build_map_type(
388
394
  build: builder.SpecBuilder, stype: builder.SpecTypeDefn, python: bool = False
389
395
  ) -> MapType | None:
390
- # limited support for now
391
396
  if (
392
397
  isinstance(stype, builder.SpecTypeDefnObject)
393
- and len(stype.parameters) == 0
394
398
  and not stype.is_base
395
399
  and stype.base is not None
396
400
  ):
397
401
  _, ext_info = _validate_type_ext_info(stype)
398
402
 
399
403
  properties: dict[OpaqueKey, MapProperty] = {}
404
+ params = stype.parameters if len(stype.parameters) > 0 else None
405
+ base_for_path = (
406
+ stype.base_type_instance
407
+ if stype.base_type_instance is not None
408
+ else stype.base
409
+ )
400
410
  map_type = MapTypeObject(
401
411
  type_name=stype.name,
402
412
  label=stype.label,
403
413
  properties=properties,
404
414
  desc=stype.desc,
405
- base_type_path=type_path_of(stype.base),
415
+ base_type_path=type_path_of(base_for_path),
406
416
  ext_info=ext_info,
417
+ parameters=params,
407
418
  )
408
419
 
409
420
  if stype.properties is not None:
@@ -441,8 +452,6 @@ def _build_map_type(
441
452
  )
442
453
 
443
454
  if isinstance(stype, builder.SpecTypeDefnUnion):
444
- # Emit as a basic alias for now, as the front-end supports only those for now
445
- # IMPROVE: We should emit a proper union type and support that
446
455
  backing = stype.get_backing_type()
447
456
  ext_info = _parse_ext_info(stype.ext_info)
448
457
  return MapTypeAlias(
@@ -14,8 +14,6 @@ After that you can also specify a `!` indicating the argument may not be null.
14
14
  If this is not specified, then a null input on this argument should produce a null output.
15
15
  We prefer not to use `!` as we want to encourage null pass-through where possible.
16
16
 
17
- If null is allowed as a legitimate value, such as in conditionals like `is_null`,
18
- then `!usenull` must be specified, this distinguishes it from the pass-through case.
19
17
  The accepted argument type must accept "None", it is not implied.
20
18
  """
21
19
 
@@ -87,7 +85,7 @@ class Source:
87
85
  return self._text[start : self._at]
88
86
 
89
87
 
90
- _re_argument_name = re.compile(r"([a-z_]+)(\?|\+)?(!|!usenull)?:")
88
+ _re_argument_name = re.compile(r"([a-z_]+)(\?|\+)?(!)?:")
91
89
 
92
90
 
93
91
  def parse_function_signature(text: str) -> ParsedFunctionSignature:
@@ -111,10 +109,8 @@ def parse_function_signature(text: str) -> ParsedFunctionSignature:
111
109
  match arg_group.group(3):
112
110
  case "!":
113
111
  on_null = value_spec_t.OnNull.DISALLOW
114
- case "!usenull":
115
- on_null = value_spec_t.OnNull.USE
116
112
  case _:
117
- on_null = value_spec_t.OnNull.PASS
113
+ on_null = value_spec_t.OnNull.USE
118
114
 
119
115
  extant = value_spec_t.ArgumentExtant.REQUIRED
120
116
  extant_marker = arg_group.group(2)
@@ -70,7 +70,7 @@ def _emit_function_wrapper(function: value_spec_t.Function) -> str:
70
70
  else:
71
71
  python_type = _emit_python_type(argument.type)
72
72
  if (
73
- argument.on_null == value_spec_t.OnNull.PASS
73
+ argument.on_null == value_spec_t.OnNull.USE
74
74
  or argument.extant == value_spec_t.ArgumentExtant.MISSING
75
75
  ):
76
76
  python_type += " | None"
@@ -105,7 +105,7 @@ def send_retry_job_message(
105
105
 
106
106
  return response.queued_job_uuid
107
107
  except grpc.RpcError as e:
108
- raise ValueError(e.details()) # type: ignore
108
+ raise ValueError(e.details())
109
109
 
110
110
 
111
111
  def check_health(*, host: str = _LOCAL_RPC_HOST, port: int) -> bool:
@@ -152,7 +152,7 @@ def send_list_queued_jobs_message(
152
152
  request, timeout=_DEFAULT_MESSAGE_TIMEOUT_SECS
153
153
  )
154
154
  except grpc.RpcError as e:
155
- raise ValueError(e.details()) # type: ignore
155
+ raise ValueError(e.details())
156
156
 
157
157
  assert isinstance(response, ListQueuedJobsResult)
158
158
  return list(response.queued_jobs)
@@ -167,7 +167,7 @@ def send_vaccuum_queued_jobs_message(*, host: str = "localhost", port: int) -> N
167
167
  request, timeout=_DEFAULT_MESSAGE_TIMEOUT_SECS
168
168
  )
169
169
  except grpc.RpcError as e:
170
- raise ValueError(e.details()) # type: ignore
170
+ raise ValueError(e.details())
171
171
 
172
172
  assert isinstance(response, VaccuumQueuedJobsResult)
173
173
  return None
@@ -1,3 +1,4 @@
1
+ import dataclasses
1
2
  import datetime
2
3
  import functools
3
4
  import json
@@ -30,6 +31,7 @@ from opentelemetry.sdk.trace.export import (
30
31
  )
31
32
  from opentelemetry.trace import Span, Tracer
32
33
 
34
+ from pkgs.serialization_util import dict_fields
33
35
  from uncountable.core.environment import (
34
36
  get_otel_enabled,
35
37
  get_server_env,
@@ -229,60 +231,75 @@ class Logger:
229
231
  yield self
230
232
 
231
233
 
234
+ @dataclasses.dataclass(frozen=True, kw_only=True, slots=True)
235
+ class _JobResourceStats:
236
+ cpu_user_s: float
237
+ cpu_system_s: float
238
+ cpu_total_s: float
239
+ wall_time_s: float
240
+ current_rss_mb: float
241
+ peak_rss_mb: float
242
+
243
+
232
244
  class PerJobResourceTracker:
233
245
  def __init__(
234
246
  self,
235
247
  logger: "JobLogger",
248
+ *,
236
249
  sample_interval: float = 0.5,
237
250
  log_interval: float = 30.0,
251
+ bootup_delay: float = 3.0,
238
252
  ) -> None:
239
253
  self.logger = logger
240
254
  self.sample_interval = sample_interval
241
255
  self.log_interval = log_interval
256
+ self.bootup_delay = bootup_delay
242
257
  self._process = psutil.Process(os.getpid())
243
258
  self._stop_event = threading.Event()
244
259
  self._thread: threading.Thread | None = None
245
260
 
246
261
  self.max_rss: int = 0
247
262
  self.start_cpu_times: psutil._ntp.pcputimes | None = None
248
- self.end_cpu_times: psutil._ntp.pcputimes | None = None
249
263
  self.start_wall_time: float | None = None
250
- self.end_wall_time: float | None = None
251
264
 
252
- def _current_stats(self) -> Attributes:
265
+ def _current_stats(self) -> _JobResourceStats:
253
266
  assert self.start_cpu_times is not None
254
267
  assert self.start_wall_time is not None
255
268
  current_cpu_times = self._process.cpu_times()
256
269
  cpu_user = current_cpu_times.user - self.start_cpu_times.user
257
270
  cpu_sys = current_cpu_times.system - self.start_cpu_times.system
258
- cpu_total = cpu_user + cpu_sys
259
- elapsed = time.monotonic() - self.start_wall_time
260
- return {
261
- "cpu_user_s": round(cpu_user, 3),
262
- "cpu_system_s": round(cpu_sys, 3),
263
- "cpu_total_s": round(cpu_total, 3),
264
- "wall_time_s": round(elapsed, 3),
265
- "current_rss_mb": round(self._process.memory_info().rss / (1024 * 1024), 2),
266
- "peak_rss_mb": round(self.max_rss / (1024 * 1024), 2),
267
- }
271
+ return _JobResourceStats(
272
+ cpu_user_s=round(cpu_user, 3),
273
+ cpu_system_s=round(cpu_sys, 3),
274
+ cpu_total_s=round(cpu_user + cpu_sys, 3),
275
+ wall_time_s=round(time.monotonic() - self.start_wall_time, 3),
276
+ current_rss_mb=round(self._process.memory_info().rss / (1024 * 1024), 2),
277
+ peak_rss_mb=round(self.max_rss / (1024 * 1024), 2),
278
+ )
279
+
280
+ def _log_stats(self, message: str) -> None:
281
+ self.logger.log_debug(
282
+ message, attributes=_cast_attributes(dict_fields(self._current_stats()))
283
+ )
268
284
 
269
285
  def start(self) -> None:
270
286
  self.start_cpu_times = self._process.cpu_times()
271
287
  self.start_wall_time = time.monotonic()
272
288
 
273
289
  def _monitor() -> None:
274
- last_log_time = time.monotonic()
290
+ now = time.monotonic()
291
+ boot_at: float | None = now + self.bootup_delay
292
+ next_periodic_at = now + self.log_interval
275
293
  try:
276
294
  while not self._stop_event.is_set():
277
- rss = self._process.memory_info().rss
278
- self.max_rss = max(self.max_rss, rss)
295
+ self.max_rss = max(self.max_rss, self._process.memory_info().rss)
279
296
  now = time.monotonic()
280
- if now - last_log_time >= self.log_interval:
281
- self.logger.log_debug(
282
- "Job resource usage (periodic)",
283
- attributes=self._current_stats(),
284
- )
285
- last_log_time = now
297
+ if boot_at is not None and now >= boot_at:
298
+ self._log_stats("Job resource usage (bootup)")
299
+ boot_at = None
300
+ if now >= next_periodic_at:
301
+ self._log_stats("Job resource usage (periodic)")
302
+ next_periodic_at = now + self.log_interval
286
303
  time.sleep(self.sample_interval)
287
304
  except Exception:
288
305
  self._stop_event.set()
@@ -294,8 +311,6 @@ class PerJobResourceTracker:
294
311
  self._stop_event.set()
295
312
  if self._thread is not None:
296
313
  self._thread.join()
297
- self.end_cpu_times = self._process.cpu_times()
298
- self.end_wall_time = time.monotonic()
299
314
 
300
315
  def __enter__(self) -> typing.Self:
301
316
  self.start()
@@ -308,7 +323,6 @@ class PerJobResourceTracker:
308
323
  traceback: types.TracebackType | None,
309
324
  ) -> None:
310
325
  self.stop()
311
- stats = dict(self.summary())
312
326
  if isinstance(exc_value, MemoryError):
313
327
  if resource is not None:
314
328
  limit, _ = resource.getrlimit(resource.RLIMIT_AS)
@@ -320,26 +334,7 @@ class PerJobResourceTracker:
320
334
  ),
321
335
  )
322
336
  return
323
- self.logger.log_debug("Job resource usage summary", attributes=stats)
324
- return
325
-
326
- def summary(self) -> Attributes:
327
- assert self.start_cpu_times is not None
328
- assert self.end_cpu_times is not None
329
- assert self.start_wall_time is not None
330
- assert self.end_wall_time is not None
331
-
332
- cpu_user = self.end_cpu_times.user - self.start_cpu_times.user
333
- cpu_sys = self.end_cpu_times.system - self.start_cpu_times.system
334
- cpu_total = cpu_user + cpu_sys
335
- elapsed = self.end_wall_time - self.start_wall_time
336
- return {
337
- "cpu_user_s": round(cpu_user, 3),
338
- "cpu_system_s": round(cpu_sys, 3),
339
- "cpu_total_s": round(cpu_total, 3),
340
- "wall_time_s": round(elapsed, 3),
341
- "peak_rss_mb": round(self.max_rss / (1024 * 1024), 2),
342
- }
337
+ self._log_stats("Job resource usage summary")
343
338
 
344
339
 
345
340
  class JobLogger(Logger):
@@ -43,7 +43,7 @@ class RequestMethod(StrEnum):
43
43
  named_type_path="sdk.api.batch.execute_batch.BatchRequest",
44
44
  unconverted_values={"data"},
45
45
  )
46
- @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
46
+ @dataclasses.dataclass(slots=True, kw_only=True)
47
47
  class BatchRequest:
48
48
  path: str
49
49
  method: RequestMethod
@@ -54,7 +54,7 @@ class BatchRequest:
54
54
  @serial_class(
55
55
  named_type_path="sdk.api.batch.execute_batch.Arguments",
56
56
  )
57
- @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
57
+ @dataclasses.dataclass(slots=True, kw_only=True)
58
58
  class Arguments:
59
59
  requests: list[BatchRequest]
60
60
 
@@ -64,7 +64,7 @@ class Arguments:
64
64
  named_type_path="sdk.api.batch.execute_batch.BatchResponse",
65
65
  unconverted_values={"response"},
66
66
  )
67
- @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
67
+ @dataclasses.dataclass(slots=True, kw_only=True)
68
68
  class BatchResponse:
69
69
  path: str
70
70
  method: RequestMethod
@@ -76,7 +76,7 @@ class BatchResponse:
76
76
  @serial_class(
77
77
  named_type_path="sdk.api.batch.execute_batch.Data",
78
78
  )
79
- @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
79
+ @dataclasses.dataclass(slots=True, kw_only=True)
80
80
  class Data:
81
81
  responses: list[BatchResponse]
82
82
  # DO NOT MODIFY -- This file is generated by type_spec
@@ -26,7 +26,7 @@ ENDPOINT_PATH = "api/external/batch/execute_batch_load_async"
26
26
  @serial_class(
27
27
  named_type_path="sdk.api.batch.execute_batch_load_async.Arguments",
28
28
  )
29
- @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
29
+ @dataclasses.dataclass(slots=True, kw_only=True)
30
30
  class Arguments:
31
31
  requests: list[async_batch_t.AsyncBatchRequest]
32
32
 
@@ -35,7 +35,7 @@ class Arguments:
35
35
  @serial_class(
36
36
  named_type_path="sdk.api.batch.execute_batch_load_async.Data",
37
37
  )
38
- @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
38
+ @dataclasses.dataclass(slots=True, kw_only=True)
39
39
  class Data:
40
40
  job_id: base_t.ObjectId
41
41
  # DO NOT MODIFY -- This file is generated by type_spec
@@ -28,7 +28,7 @@ ENDPOINT_PATH = "api/external/chemical/convert_chemical_formats"
28
28
  @serial_class(
29
29
  named_type_path="sdk.api.chemical.convert_chemical_formats.ChemicalStructureFile",
30
30
  )
31
- @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
31
+ @dataclasses.dataclass(slots=True, kw_only=True)
32
32
  class ChemicalStructureFile:
33
33
  struct_file: str
34
34
 
@@ -37,7 +37,7 @@ class ChemicalStructureFile:
37
37
  @serial_class(
38
38
  named_type_path="sdk.api.chemical.convert_chemical_formats.Arguments",
39
39
  )
40
- @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
40
+ @dataclasses.dataclass(slots=True, kw_only=True)
41
41
  class Arguments:
42
42
  source_chemical_structures: list[ChemicalStructureFile]
43
43
 
@@ -56,7 +56,7 @@ UncountableChemicalStructure = typing.Annotated[
56
56
  named_type_path="sdk.api.chemical.convert_chemical_formats.Data",
57
57
  unconverted_values={"chemical_structures"},
58
58
  )
59
- @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
59
+ @dataclasses.dataclass(slots=True, kw_only=True)
60
60
  class Data:
61
61
  chemical_structures: list[UncountableChemicalStructure]
62
62
  # DO NOT MODIFY -- This file is generated by type_spec
@@ -10,7 +10,6 @@ import dataclasses
10
10
  from pkgs.serialization import serial_class
11
11
  from pkgs.serialization import serial_alias_annotation
12
12
  from ... import async_batch_t
13
- from ... import base_t
14
13
  from ... import condition_match_t
15
14
  from ... import identifier_t
16
15
 
@@ -32,7 +31,7 @@ ENDPOINT_PATH = "api/external/condition_parameters/upsert_condition_match"
32
31
  named_type_path="sdk.api.condition_parameters.upsert_condition_match.ConditionParameter",
33
32
  to_string_values={"max_value", "min_value"},
34
33
  )
35
- @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
34
+ @dataclasses.dataclass(slots=True, kw_only=True)
36
35
  class ConditionParameter:
37
36
  condition_parameter_key: identifier_t.IdentifierKey
38
37
  allow_null: bool
@@ -55,7 +54,7 @@ MatchType = typing.Annotated[
55
54
  @serial_class(
56
55
  named_type_path="sdk.api.condition_parameters.upsert_condition_match.Arguments",
57
56
  )
58
- @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
57
+ @dataclasses.dataclass(slots=True, kw_only=True)
59
58
  class Arguments:
60
59
  explicit_name: bool = False
61
60
  name: str | None = None
@@ -68,7 +67,7 @@ class Arguments:
68
67
  @serial_class(
69
68
  named_type_path="sdk.api.condition_parameters.upsert_condition_match.Data",
70
69
  )
71
- @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
70
+ @dataclasses.dataclass(slots=True, kw_only=True)
72
71
  class Data(async_batch_t.AsyncBatchActionReturn):
73
72
  pass
74
73
  # DO NOT MODIFY -- This file is generated by type_spec
@@ -10,7 +10,6 @@ import dataclasses
10
10
  from pkgs.serialization import serial_class
11
11
  from pkgs.serialization import serial_union_annotation
12
12
  from ... import async_batch_t
13
- from ... import base_t
14
13
  from ... import condition_match_t
15
14
  from ... import identifier_t
16
15
 
@@ -38,7 +37,7 @@ ENDPOINT_PATH = "api/external/condition_parameters/upsert_condition_matches"
38
37
  named_type_path="sdk.api.condition_parameters.upsert_condition_matches.ConditionParameterAll",
39
38
  parse_require={"match_type"},
40
39
  )
41
- @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
40
+ @dataclasses.dataclass(slots=True, kw_only=True)
42
41
  class ConditionParameterAll:
43
42
  condition_parameter_key: identifier_t.IdentifierKey
44
43
  allow_null: bool
@@ -50,7 +49,7 @@ class ConditionParameterAll:
50
49
  named_type_path="sdk.api.condition_parameters.upsert_condition_matches.ConditionParameterEqNumeric",
51
50
  parse_require={"match_type"},
52
51
  )
53
- @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
52
+ @dataclasses.dataclass(slots=True, kw_only=True)
54
53
  class ConditionParameterEqNumeric:
55
54
  condition_parameter_key: identifier_t.IdentifierKey
56
55
  allow_null: bool
@@ -63,7 +62,7 @@ class ConditionParameterEqNumeric:
63
62
  named_type_path="sdk.api.condition_parameters.upsert_condition_matches.ConditionParameterEqCategorical",
64
63
  parse_require={"match_type"},
65
64
  )
66
- @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
65
+ @dataclasses.dataclass(slots=True, kw_only=True)
67
66
  class ConditionParameterEqCategorical:
68
67
  condition_parameter_key: identifier_t.IdentifierKey
69
68
  allow_null: bool
@@ -77,7 +76,7 @@ class ConditionParameterEqCategorical:
77
76
  to_string_values={"max_value", "min_value"},
78
77
  parse_require={"match_type"},
79
78
  )
80
- @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
79
+ @dataclasses.dataclass(slots=True, kw_only=True)
81
80
  class ConditionParameterRange:
82
81
  condition_parameter_key: identifier_t.IdentifierKey
83
82
  allow_null: bool
@@ -107,7 +106,7 @@ ConditionParameter = typing.Annotated[
107
106
  named_type_path="sdk.api.condition_parameters.upsert_condition_matches.UpsertArgsParameters",
108
107
  parse_require={"kind"},
109
108
  )
110
- @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
109
+ @dataclasses.dataclass(slots=True, kw_only=True)
111
110
  class UpsertArgsParameters:
112
111
  condition_parameters: list[ConditionParameter]
113
112
  kind: typing.Literal["condition_parameters"] = "condition_parameters"
@@ -120,7 +119,7 @@ class UpsertArgsParameters:
120
119
  named_type_path="sdk.api.condition_parameters.upsert_condition_matches.UpsertArgsOutputConditions",
121
120
  parse_require={"kind"},
122
121
  )
123
- @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
122
+ @dataclasses.dataclass(slots=True, kw_only=True)
124
123
  class UpsertArgsOutputConditions:
125
124
  output_condition_keys: list[identifier_t.IdentifierKey]
126
125
  kind: typing.Literal["output_conditions"] = "output_conditions"
@@ -146,7 +145,7 @@ UpsertArgs = typing.Annotated[
146
145
  @serial_class(
147
146
  named_type_path="sdk.api.condition_parameters.upsert_condition_matches.Arguments",
148
147
  )
149
- @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
148
+ @dataclasses.dataclass(slots=True, kw_only=True)
150
149
  class Arguments:
151
150
  upserts: list[UpsertArgs]
152
151
 
@@ -155,7 +154,7 @@ class Arguments:
155
154
  @serial_class(
156
155
  named_type_path="sdk.api.condition_parameters.upsert_condition_matches.Data",
157
156
  )
158
- @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
157
+ @dataclasses.dataclass(slots=True, kw_only=True)
159
158
  class Data:
160
159
  results: list[async_batch_t.AsyncBatchActionReturn]
161
160
  # DO NOT MODIFY -- This file is generated by type_spec
@@ -29,7 +29,7 @@ ENDPOINT_PATH = "api/external/entity/external_create_entities"
29
29
  @serial_class(
30
30
  named_type_path="sdk.api.entity.create_entities.EntityToCreate",
31
31
  )
32
- @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
32
+ @dataclasses.dataclass(slots=True, kw_only=True)
33
33
  class EntityToCreate:
34
34
  field_values: list[field_values_t.FieldRefNameValue] | None = None
35
35
  parent_entity: entity_t.Entity | None = None
@@ -39,7 +39,7 @@ class EntityToCreate:
39
39
  @serial_class(
40
40
  named_type_path="sdk.api.entity.create_entities.Arguments",
41
41
  )
42
- @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
42
+ @dataclasses.dataclass(slots=True, kw_only=True)
43
43
  class Arguments:
44
44
  entity_type: entity_t.LimitedEntityType
45
45
  entities_to_create: list[EntityToCreate]
@@ -51,7 +51,7 @@ class Arguments:
51
51
  @serial_class(
52
52
  named_type_path="sdk.api.entity.create_entities.Data",
53
53
  )
54
- @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
54
+ @dataclasses.dataclass(slots=True, kw_only=True)
55
55
  class Data:
56
56
  entities: list[entity_t.Entity]
57
57
  # DO NOT MODIFY -- This file is generated by type_spec
@@ -30,7 +30,7 @@ ENDPOINT_PATH = "api/external/entity/external_create_entity"
30
30
  named_type_path="sdk.api.entity.create_entity.EntityFieldInitialValue",
31
31
  unconverted_values={"value"},
32
32
  )
33
- @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
33
+ @dataclasses.dataclass(slots=True, kw_only=True)
34
34
  class EntityFieldInitialValue:
35
35
  field_ref_name: str
36
36
  value: base_t.JsonValue
@@ -41,7 +41,7 @@ class EntityFieldInitialValue:
41
41
  @serial_class(
42
42
  named_type_path="sdk.api.entity.create_entity.Arguments",
43
43
  )
44
- @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
44
+ @dataclasses.dataclass(slots=True, kw_only=True)
45
45
  class Arguments:
46
46
  entity_type: entity_t.LimitedEntityType
47
47
  definition_id: base_t.ObjectId | None = None
@@ -54,7 +54,7 @@ class Arguments:
54
54
  @serial_class(
55
55
  named_type_path="sdk.api.entity.create_entity.Data",
56
56
  )
57
- @dataclasses.dataclass(slots=base_t.ENABLE_SLOTS, kw_only=True) # type: ignore[literal-required]
57
+ @dataclasses.dataclass(slots=True, kw_only=True)
58
58
  class Data:
59
59
  entity: entity_t.Entity
60
60
  # DO NOT MODIFY -- This file is generated by type_spec