UncountablePythonSDK 0.0.34__tar.gz → 0.0.36__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 (198) hide show
  1. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/.github/workflows/publish.yml +1 -1
  2. {uncountablepythonsdk-0.0.34/UncountablePythonSDK.egg-info → uncountablepythonsdk-0.0.36}/PKG-INFO +1 -1
  3. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36/UncountablePythonSDK.egg-info}/PKG-INFO +1 -1
  4. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/UncountablePythonSDK.egg-info/SOURCES.txt +4 -0
  5. uncountablepythonsdk-0.0.36/examples/edit_recipe_inputs.py +45 -0
  6. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/pkgs/serialization_util/serialization_helpers.py +28 -47
  7. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/pkgs/type_spec/builder.py +21 -0
  8. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/pkgs/type_spec/emit_open_api.py +11 -0
  9. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/pkgs/type_spec/emit_open_api_util.py +4 -0
  10. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/pkgs/type_spec/emit_typescript_util.py +2 -2
  11. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/uncountable/types/__init__.py +6 -0
  12. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/uncountable/types/api/entity/list_entities.py +1 -1
  13. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/uncountable/types/api/recipes/edit_recipe_inputs.py +27 -1
  14. uncountablepythonsdk-0.0.36/uncountable/types/api/recipes/lock_recipes.py +53 -0
  15. uncountablepythonsdk-0.0.36/uncountable/types/api/recipes/set_recipe_output_annotations.py +102 -0
  16. uncountablepythonsdk-0.0.36/uncountable/types/api/recipes/unlock_recipes.py +43 -0
  17. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/uncountable/types/async_batch.py +2 -0
  18. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/uncountable/types/client_base.py +83 -2
  19. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/.github/workflows/documentation.yml +0 -0
  20. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/.gitignore +0 -0
  21. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/README.md +0 -0
  22. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/UncountablePythonSDK.egg-info/dependency_links.txt +0 -0
  23. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/UncountablePythonSDK.egg-info/requires.txt +0 -0
  24. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/UncountablePythonSDK.egg-info/top_level.txt +0 -0
  25. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/docs/.gitignore +0 -0
  26. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/docs/conf.py +0 -0
  27. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/docs/index.md +0 -0
  28. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/docs/justfile +0 -0
  29. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/docs/quickstart.md +0 -0
  30. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/docs/requirements.txt +0 -0
  31. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/docs/static/favicons/android-chrome-192x192.png +0 -0
  32. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/docs/static/favicons/android-chrome-512x512.png +0 -0
  33. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/docs/static/favicons/apple-touch-icon.png +0 -0
  34. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/docs/static/favicons/browserconfig.xml +0 -0
  35. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/docs/static/favicons/favicon-16x16.png +0 -0
  36. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/docs/static/favicons/favicon-32x32.png +0 -0
  37. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/docs/static/favicons/manifest.json +0 -0
  38. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/docs/static/favicons/mstile-150x150.png +0 -0
  39. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/docs/static/favicons/safari-pinned-tab.svg +0 -0
  40. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/docs/static/logo_blue.png +0 -0
  41. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/examples/async_batch.py +0 -0
  42. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/examples/create_entity.py +0 -0
  43. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/examples/upload_files.py +0 -0
  44. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/pkgs/__init__.py +0 -0
  45. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/pkgs/argument_parser/__init__.py +0 -0
  46. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/pkgs/argument_parser/_is_enum.py +0 -0
  47. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/pkgs/argument_parser/_is_namedtuple.py +0 -0
  48. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/pkgs/argument_parser/argument_parser.py +0 -0
  49. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/pkgs/argument_parser/case_convert.py +0 -0
  50. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/pkgs/serialization/__init__.py +0 -0
  51. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/pkgs/serialization/missing_sentry.py +0 -0
  52. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/pkgs/serialization/opaque_key.py +0 -0
  53. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/pkgs/serialization/serial_class.py +0 -0
  54. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/pkgs/serialization/serial_union.py +0 -0
  55. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/pkgs/serialization_util/__init__.py +0 -0
  56. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/pkgs/serialization_util/_get_type_for_serialization.py +0 -0
  57. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/pkgs/serialization_util/convert_to_snakecase.py +0 -0
  58. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/pkgs/strenum_compat/__init__.py +0 -0
  59. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/pkgs/strenum_compat/strenum_compat.py +0 -0
  60. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/pkgs/type_spec/__init__.py +0 -0
  61. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/pkgs/type_spec/__main__.py +0 -0
  62. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/pkgs/type_spec/actions_registry/__init__.py +0 -0
  63. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/pkgs/type_spec/actions_registry/__main__.py +0 -0
  64. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/pkgs/type_spec/actions_registry/emit_typescript.py +0 -0
  65. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/pkgs/type_spec/config.py +0 -0
  66. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/pkgs/type_spec/emit_io_ts.py +0 -0
  67. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/pkgs/type_spec/emit_python.py +0 -0
  68. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/pkgs/type_spec/emit_typescript.py +0 -0
  69. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/pkgs/type_spec/load_types.py +0 -0
  70. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/pkgs/type_spec/open_api_util.py +0 -0
  71. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/pkgs/type_spec/parts/base.py.prepart +0 -0
  72. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/pkgs/type_spec/parts/base.ts.prepart +0 -0
  73. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/pkgs/type_spec/test.py +0 -0
  74. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/pkgs/type_spec/type_info/__main__.py +0 -0
  75. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/pkgs/type_spec/type_info/emit_type_info.py +0 -0
  76. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/pkgs/type_spec/util.py +0 -0
  77. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/pkgs/type_spec/value_spec/__init__.py +0 -0
  78. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/pkgs/type_spec/value_spec/__main__.py +0 -0
  79. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/pkgs/type_spec/value_spec/convert_type.py +0 -0
  80. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/pkgs/type_spec/value_spec/emit_python.py +0 -0
  81. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/pkgs/type_spec/value_spec/types.py +0 -0
  82. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/pyproject.toml +0 -0
  83. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/setup.cfg +0 -0
  84. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/uncountable/__init__.py +0 -0
  85. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/uncountable/core/__init__.py +0 -0
  86. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/uncountable/core/async_batch.py +0 -0
  87. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/uncountable/core/client.py +0 -0
  88. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/uncountable/core/file_upload.py +0 -0
  89. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/uncountable/core/types.py +0 -0
  90. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/uncountable/integration/__init__.py +0 -0
  91. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/uncountable/integration/construct_client.py +0 -0
  92. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/uncountable/integration/cron.py +0 -0
  93. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/uncountable/integration/db/__init__.py +0 -0
  94. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/uncountable/integration/db/connect.py +0 -0
  95. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/uncountable/integration/entrypoint.py +0 -0
  96. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/uncountable/integration/executors/__init__.py +0 -0
  97. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/uncountable/integration/executors/script_executor.py +0 -0
  98. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/uncountable/integration/job.py +0 -0
  99. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/uncountable/integration/server.py +0 -0
  100. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/uncountable/integration/types.py +0 -0
  101. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/uncountable/py.typed +0 -0
  102. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/uncountable/types/api/__init__.py +0 -0
  103. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/uncountable/types/api/batch/__init__.py +0 -0
  104. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/uncountable/types/api/batch/execute_batch.py +0 -0
  105. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/uncountable/types/api/batch/execute_batch_load_async.py +0 -0
  106. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/uncountable/types/api/chemical/__init__.py +0 -0
  107. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/uncountable/types/api/chemical/convert_chemical_formats.py +0 -0
  108. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/uncountable/types/api/entity/__init__.py +0 -0
  109. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/uncountable/types/api/entity/create_entities.py +0 -0
  110. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/uncountable/types/api/entity/create_entity.py +0 -0
  111. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/uncountable/types/api/entity/get_entities_data.py +0 -0
  112. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/uncountable/types/api/entity/lock_entity.py +0 -0
  113. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/uncountable/types/api/entity/resolve_entity_ids.py +0 -0
  114. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/uncountable/types/api/entity/set_values.py +0 -0
  115. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/uncountable/types/api/entity/transition_entity_phase.py +0 -0
  116. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/uncountable/types/api/entity/unlock_entity.py +0 -0
  117. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/uncountable/types/api/field_options/__init__.py +0 -0
  118. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/uncountable/types/api/field_options/upsert_field_options.py +0 -0
  119. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/uncountable/types/api/id_source/__init__.py +0 -0
  120. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/uncountable/types/api/id_source/list_id_source.py +0 -0
  121. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/uncountable/types/api/id_source/match_id_source.py +0 -0
  122. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/uncountable/types/api/input_groups/__init__.py +0 -0
  123. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/uncountable/types/api/input_groups/get_input_group_names.py +0 -0
  124. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/uncountable/types/api/inputs/__init__.py +0 -0
  125. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/uncountable/types/api/inputs/create_inputs.py +0 -0
  126. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/uncountable/types/api/inputs/get_input_data.py +0 -0
  127. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/uncountable/types/api/inputs/get_input_names.py +0 -0
  128. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/uncountable/types/api/inputs/get_inputs_data.py +0 -0
  129. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/uncountable/types/api/inputs/set_input_attribute_values.py +0 -0
  130. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/uncountable/types/api/inputs/set_input_category.py +0 -0
  131. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/uncountable/types/api/inputs/set_input_subcategories.py +0 -0
  132. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/uncountable/types/api/inputs/set_intermediate_type.py +0 -0
  133. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/uncountable/types/api/material_families/__init__.py +0 -0
  134. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/uncountable/types/api/material_families/update_entity_material_families.py +0 -0
  135. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/uncountable/types/api/outputs/__init__.py +0 -0
  136. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/uncountable/types/api/outputs/get_output_data.py +0 -0
  137. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/uncountable/types/api/outputs/get_output_names.py +0 -0
  138. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/uncountable/types/api/outputs/resolve_output_conditions.py +0 -0
  139. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/uncountable/types/api/permissions/__init__.py +0 -0
  140. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/uncountable/types/api/permissions/set_core_permissions.py +0 -0
  141. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/uncountable/types/api/project/__init__.py +0 -0
  142. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/uncountable/types/api/project/get_projects.py +0 -0
  143. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/uncountable/types/api/project/get_projects_data.py +0 -0
  144. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/uncountable/types/api/recipe_links/__init__.py +0 -0
  145. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/uncountable/types/api/recipe_links/create_recipe_link.py +0 -0
  146. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/uncountable/types/api/recipe_metadata/__init__.py +0 -0
  147. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/uncountable/types/api/recipe_metadata/get_recipe_metadata_data.py +0 -0
  148. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/uncountable/types/api/recipes/__init__.py +0 -0
  149. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/uncountable/types/api/recipes/add_recipe_to_project.py +0 -0
  150. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/uncountable/types/api/recipes/archive_recipes.py +0 -0
  151. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/uncountable/types/api/recipes/associate_recipe_as_input.py +0 -0
  152. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/uncountable/types/api/recipes/associate_recipe_as_lot.py +0 -0
  153. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/uncountable/types/api/recipes/create_recipe.py +0 -0
  154. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/uncountable/types/api/recipes/create_recipes.py +0 -0
  155. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/uncountable/types/api/recipes/disassociate_recipe_as_input.py +0 -0
  156. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/uncountable/types/api/recipes/get_curve.py +0 -0
  157. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/uncountable/types/api/recipes/get_recipe_calculations.py +0 -0
  158. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/uncountable/types/api/recipes/get_recipe_links.py +0 -0
  159. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/uncountable/types/api/recipes/get_recipe_names.py +0 -0
  160. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/uncountable/types/api/recipes/get_recipe_output_metadata.py +0 -0
  161. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/uncountable/types/api/recipes/get_recipes_data.py +0 -0
  162. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/uncountable/types/api/recipes/remove_recipe_from_project.py +0 -0
  163. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/uncountable/types/api/recipes/set_recipe_inputs.py +0 -0
  164. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/uncountable/types/api/recipes/set_recipe_metadata.py +0 -0
  165. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/uncountable/types/api/recipes/set_recipe_outputs.py +0 -0
  166. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/uncountable/types/api/recipes/set_recipe_tags.py +0 -0
  167. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/uncountable/types/api/recipes/unarchive_recipes.py +0 -0
  168. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/uncountable/types/api/triggers/__init__.py +0 -0
  169. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/uncountable/types/api/triggers/run_trigger.py +0 -0
  170. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/uncountable/types/async_batch_processor.py +0 -0
  171. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/uncountable/types/base.py +0 -0
  172. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/uncountable/types/calculations.py +0 -0
  173. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/uncountable/types/chemical_structure.py +0 -0
  174. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/uncountable/types/curves.py +0 -0
  175. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/uncountable/types/entity.py +0 -0
  176. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/uncountable/types/experiment_groups.py +0 -0
  177. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/uncountable/types/field_values.py +0 -0
  178. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/uncountable/types/fields.py +0 -0
  179. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/uncountable/types/id_source.py +0 -0
  180. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/uncountable/types/identifier.py +0 -0
  181. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/uncountable/types/input_attributes.py +0 -0
  182. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/uncountable/types/inputs.py +0 -0
  183. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/uncountable/types/outputs.py +0 -0
  184. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/uncountable/types/permissions.py +0 -0
  185. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/uncountable/types/phases.py +0 -0
  186. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/uncountable/types/post_base.py +0 -0
  187. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/uncountable/types/recipe_identifiers.py +0 -0
  188. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/uncountable/types/recipe_inputs.py +0 -0
  189. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/uncountable/types/recipe_links.py +0 -0
  190. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/uncountable/types/recipe_metadata.py +0 -0
  191. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/uncountable/types/recipe_output_metadata.py +0 -0
  192. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/uncountable/types/recipe_tags.py +0 -0
  193. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/uncountable/types/recipe_workflow_steps.py +0 -0
  194. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/uncountable/types/recipes.py +0 -0
  195. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/uncountable/types/response.py +0 -0
  196. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/uncountable/types/units.py +0 -0
  197. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/uncountable/types/users.py +0 -0
  198. {uncountablepythonsdk-0.0.34 → uncountablepythonsdk-0.0.36}/uncountable/types/workflows.py +0 -0
@@ -50,4 +50,4 @@ jobs:
50
50
  name: package-distributions
51
51
  path: dist/
52
52
  - name: Publish package distributions to PyPI
53
- uses: pypa/gh-action-pypi-publish@ec4db0b4ddc65acdf4bff5fa45ac92d78b56bdf0
53
+ uses: pypa/gh-action-pypi-publish@fb9fc6a4e67ca27a7a76b17bbf90be83c2d3c716
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: UncountablePythonSDK
3
- Version: 0.0.34
3
+ Version: 0.0.36
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.34
3
+ Version: 0.0.36
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
@@ -26,6 +26,7 @@ docs/static/favicons/mstile-150x150.png
26
26
  docs/static/favicons/safari-pinned-tab.svg
27
27
  examples/async_batch.py
28
28
  examples/create_entity.py
29
+ examples/edit_recipe_inputs.py
29
30
  examples/upload_files.py
30
31
  pkgs/__init__.py
31
32
  pkgs/argument_parser/__init__.py
@@ -182,11 +183,14 @@ uncountable/types/api/recipes/get_recipe_links.py
182
183
  uncountable/types/api/recipes/get_recipe_names.py
183
184
  uncountable/types/api/recipes/get_recipe_output_metadata.py
184
185
  uncountable/types/api/recipes/get_recipes_data.py
186
+ uncountable/types/api/recipes/lock_recipes.py
185
187
  uncountable/types/api/recipes/remove_recipe_from_project.py
186
188
  uncountable/types/api/recipes/set_recipe_inputs.py
187
189
  uncountable/types/api/recipes/set_recipe_metadata.py
190
+ uncountable/types/api/recipes/set_recipe_output_annotations.py
188
191
  uncountable/types/api/recipes/set_recipe_outputs.py
189
192
  uncountable/types/api/recipes/set_recipe_tags.py
190
193
  uncountable/types/api/recipes/unarchive_recipes.py
194
+ uncountable/types/api/recipes/unlock_recipes.py
191
195
  uncountable/types/api/triggers/__init__.py
192
196
  uncountable/types/api/triggers/run_trigger.py
@@ -0,0 +1,45 @@
1
+ import os
2
+ from decimal import Decimal
3
+
4
+ from uncountable.core import AsyncBatchProcessor, AuthDetailsApiKey, Client
5
+ from uncountable.types import (
6
+ edit_recipe_inputs_t,
7
+ recipe_workflow_steps_t,
8
+ )
9
+ from uncountable.types.identifier import IdentifierKeyBatchReference, IdentifierKeyId
10
+ from uncountable.types.recipe_identifiers import (
11
+ RecipeIdentifiers,
12
+ )
13
+ from uncountable.types.recipe_inputs import QuantityBasis
14
+
15
+ client = Client(
16
+ base_url=os.environ["UNC_BASE_URL"],
17
+ auth_details=AuthDetailsApiKey(
18
+ api_id=os.environ["UNC_API_ID"], api_secret_key=os.environ["UNC_API_SECRET_KEY"]
19
+ ),
20
+ )
21
+ batch_loader = AsyncBatchProcessor(client=client)
22
+ recipe_identifiers: RecipeIdentifiers = []
23
+ req = batch_loader.create_recipe(
24
+ material_family_id=1, workflow_id=1, identifiers=recipe_identifiers
25
+ )
26
+ created_recipe_reference = req.batch_reference
27
+ edits: list[edit_recipe_inputs_t.RecipeInputEdit] = []
28
+ edits.append(
29
+ edit_recipe_inputs_t.RecipeInputEditAddInput(
30
+ quantity_basis=QuantityBasis.MASS,
31
+ ingredient_key=IdentifierKeyId(id=1),
32
+ value_numeric=Decimal(56.7),
33
+ )
34
+ )
35
+ edits.append(
36
+ edit_recipe_inputs_t.RecipeInputEditChangeBasisViewed(
37
+ quantity_basis=QuantityBasis.VOLUME, ingredient_key=IdentifierKeyId(id=1)
38
+ )
39
+ )
40
+ batch_loader.edit_recipe_inputs(
41
+ recipe_key=IdentifierKeyBatchReference(reference=created_recipe_reference),
42
+ edits=edits,
43
+ recipe_workflow_step_identifier=recipe_workflow_steps_t.RecipeWorkflowStepIdentifierDefault(),
44
+ )
45
+ job_id = batch_loader.send()
@@ -1,3 +1,6 @@
1
+ # warnings -- types here assume that keys to dictionaries are strings
2
+ # this is true most of the time, but there are cases where we have integer indexes
3
+
1
4
  import dataclasses
2
5
  import datetime
3
6
  import enum
@@ -14,11 +17,6 @@ from typing import (
14
17
  overload,
15
18
  )
16
19
 
17
- try:
18
- import flask
19
- except Exception:
20
- pass
21
-
22
20
  from pkgs.argument_parser import snake_to_camel_case
23
21
  from pkgs.serialization import (
24
22
  MISSING_SENTRY,
@@ -46,30 +44,25 @@ def identity(x: T) -> T:
46
44
  return x
47
45
 
48
46
 
49
- def key_convert_to_camelcase(o: Any) -> str:
47
+ @overload
48
+ def key_convert_to_camelcase(o: str) -> str: ...
49
+
50
+
51
+ @overload
52
+ def key_convert_to_camelcase(o: int) -> int: ...
53
+
54
+
55
+ def key_convert_to_camelcase(o: Any) -> str | int:
50
56
  if isinstance(o, OpaqueKey):
51
57
  return o
52
58
  if isinstance(o, enum.StrEnum):
53
59
  return o.value
54
- if isinstance(o, enum.Enum):
55
- try:
56
- print(
57
- "DEPRECATED_SERIALIZATION--non-string-enum-used-as-key",
58
- flask.request.path,
59
- )
60
- except Exception:
61
- pass
62
- return o.value # type: ignore[no-any-return]
63
60
  if isinstance(o, str):
64
61
  return snake_to_camel_case(o)
65
62
  if isinstance(o, int):
66
- # temporary bypass to maintain behavior
67
- return o # type: ignore[return-value]
68
- try:
69
- print("DEPRECATED_SERIALIZATION--non-string-used-as-key", o, flask.request.path)
70
- except Exception:
71
- pass
72
- return o # type: ignore[no-any-return]
63
+ # we allow dictionaries to use integer keys
64
+ return o
65
+ raise ValueError("Unexpected key type", o)
73
66
 
74
67
 
75
68
  def _convert_dict(d: dict[str, Any]) -> dict[str, JsonValue]:
@@ -124,33 +117,13 @@ def _get_dataclass_conversion_lookups(dataclass_type: Any) -> DataclassConversio
124
117
 
125
118
  def _convert_dataclass(d: Any) -> dict[str, JsonValue]:
126
119
  conversions = _get_dataclass_conversion_lookups(type(d)) # type: ignore[arg-type]
127
- # return {
128
- # conversions.key_conversions[k]: (
129
- # conversions.value_conversion_functions[k](v) if v is not None else None
130
- # )
131
- # for k, v in d.__dict__.items()
132
- # if v != MISSING_SENTRY
133
- # }
134
-
135
- serialized_data_class: dict[str, JsonValue] = {}
136
- for k, v in d.__dict__.items():
137
- if v == MISSING_SENTRY:
138
- continue
139
- if k not in conversions.key_conversions:
140
- try:
141
- print(
142
- "DEPRECATED_SERIALIZATION--missing-dataclass-key",
143
- k,
144
- flask.request.path,
145
- )
146
- except Exception:
147
- pass
148
- continue
149
- serialized_data_class[conversions.key_conversions[k]] = (
120
+ return {
121
+ conversions.key_conversions[k]: (
150
122
  conversions.value_conversion_functions[k](v) if v is not None else None
151
123
  )
152
-
153
- return serialized_data_class
124
+ for k, v in d.__dict__.items()
125
+ if v != MISSING_SENTRY
126
+ }
154
127
 
155
128
 
156
129
  _SERIALIZATION_FUNCS_STANDARD = {
@@ -192,6 +165,10 @@ def serialize_for_api(obj: Any) -> JsonValue:
192
165
  Use the CachedParser.parse_api to parse this data.
193
166
  """
194
167
  serialization_type = get_serialization_type(type(obj)) # type: ignore
168
+ if (
169
+ serialization_type == SerializationType.UNKNOWN
170
+ ): # performance optimization to not do function lookup
171
+ return obj # type: ignore
195
172
  return _CONVERSION_SERIALIZATION_FUNCS[serialization_type](obj)
196
173
 
197
174
 
@@ -219,6 +196,10 @@ def serialize_for_storage(obj: Any) -> JsonValue:
219
196
  Use the CachedParser.parse_storage to parse this data.
220
197
  """
221
198
  serialization_type = get_serialization_type(type(obj)) # type: ignore
199
+ if (
200
+ serialization_type == SerializationType.UNKNOWN
201
+ ): # performance optimization to not do function lookup
202
+ return obj # type: ignore
222
203
  return _SERIALIZATION_FUNCS[serialization_type](obj)
223
204
 
224
205
 
@@ -18,6 +18,17 @@ from .util import parse_type_str, unused
18
18
  RawDict = dict[Any, Any]
19
19
 
20
20
 
21
+ class StabilityLevel(StrEnum):
22
+ """These are currently used for open api,
23
+ see: https://github.com/Tufin/oasdiff/blob/main/docs/STABILITY.md
24
+ """
25
+
26
+ draft = "draft"
27
+ alpha = "alpha"
28
+ beta = "beta"
29
+ stable = "stable"
30
+
31
+
21
32
  class PropertyExtant(StrEnum):
22
33
  required = "required"
23
34
  optional = "optional"
@@ -791,6 +802,7 @@ class SpecEndpoint:
791
802
  data_loader: bool
792
803
  is_sdk: bool
793
804
  is_beta: bool
805
+ stability_level: StabilityLevel | None
794
806
  # Don't emit TypeScript endpoint code
795
807
  suppress_ts: bool
796
808
  function: Optional[str]
@@ -816,6 +828,7 @@ class SpecEndpoint:
816
828
  "data_loader",
817
829
  "is_sdk",
818
830
  "is_beta",
831
+ "stability_level",
819
832
  "async_batch_path",
820
833
  "function",
821
834
  "suppress_ts",
@@ -857,6 +870,14 @@ class SpecEndpoint:
857
870
  assert isinstance(is_beta, bool)
858
871
  self.is_beta = is_beta
859
872
 
873
+ stability_level_raw = data.get("stability_level")
874
+ assert stability_level_raw is None or isinstance(stability_level_raw, str)
875
+ self.stability_level = (
876
+ StabilityLevel(stability_level_raw)
877
+ if stability_level_raw is not None
878
+ else None
879
+ )
880
+
860
881
  async_batch_path = data.get("async_batch_path")
861
882
  if async_batch_path is not None:
862
883
  assert isinstance(async_batch_path, str)
@@ -23,6 +23,7 @@ from .emit_open_api_util import (
23
23
  EmitOpenAPIGuide,
24
24
  EmitOpenAPIPath,
25
25
  EmitOpenAPIServer,
26
+ EmitOpenAPIStabilityLevel,
26
27
  EmitOpenAPITag,
27
28
  GlobalContextInfo,
28
29
  TagGroupToNamedTags,
@@ -256,6 +257,14 @@ def _emit_is_beta(is_beta: bool) -> DictApiSchema:
256
257
  return {}
257
258
 
258
259
 
260
+ def _emit_stability_level(
261
+ stability_level: EmitOpenAPIStabilityLevel | None,
262
+ ) -> DictApiSchema:
263
+ if stability_level is not None:
264
+ return {"x-stability-level": str(stability_level)}
265
+ return {}
266
+
267
+
259
268
  def _emit_endpoint_request_body(
260
269
  endpoint: EmitOpenAPIEndpoint,
261
270
  arguments_type: OpenAPIType | None,
@@ -349,6 +358,7 @@ def _emit_namespace(
349
358
  }
350
359
  | _emit_endpoint_description(endpoint.description, ctx.endpoint.guides)
351
360
  | _emit_is_beta(endpoint.is_beta)
361
+ | _emit_stability_level(endpoint.stability_level)
352
362
  | _emit_endpoint_parameters(endpoint, argument_type, ctx.endpoint.examples)
353
363
  | _emit_endpoint_request_body(endpoint, argument_type, ctx.endpoint.examples)
354
364
  | {
@@ -564,6 +574,7 @@ def _emit_endpoint(
564
574
  summary=f"{'/'.join(namespace.path[path_cutoff:])}",
565
575
  description=description,
566
576
  is_beta=namespace.endpoint.is_beta,
577
+ stability_level=namespace.endpoint.stability_level,
567
578
  examples=[
568
579
  EmitOpenAPIEndpointExample(
569
580
  ref_name=f"ex_{i}",
@@ -72,6 +72,9 @@ class EmitOpenAPIEndpointExample:
72
72
  data: dict[str, object]
73
73
 
74
74
 
75
+ EmitOpenAPIStabilityLevel = builder.StabilityLevel
76
+
77
+
75
78
  @dataclass
76
79
  class EmitOpenAPIEndpoint:
77
80
  method: str
@@ -79,6 +82,7 @@ class EmitOpenAPIEndpoint:
79
82
  summary: str
80
83
  description: str
81
84
  is_beta: bool
85
+ stability_level: EmitOpenAPIStabilityLevel | None
82
86
  examples: list[EmitOpenAPIEndpointExample]
83
87
  guides: list[EmitOpenAPIGuide]
84
88
 
@@ -18,7 +18,7 @@ class EmitTypescriptContext:
18
18
 
19
19
 
20
20
  def ts_type_name(name: str) -> str:
21
- return "".join([x.capitalize() for x in name.split("_")])
21
+ return "".join([x.title() for x in name.split("_")])
22
22
 
23
23
 
24
24
  def resolve_namespace_ref(namespace: builder.SpecNamespace) -> str:
@@ -29,4 +29,4 @@ def ts_name(name: str, name_case: builder.NameCase) -> str:
29
29
  if name_case == builder.NameCase.preserve:
30
30
  return name
31
31
  bits = util.split_any_name(name)
32
- return "".join([bits[0], *[x.capitalize() for x in bits[1:]]])
32
+ return "".join([bits[0], *[x.title() for x in bits[1:]]])
@@ -50,6 +50,7 @@ from . import inputs as inputs_t
50
50
  from .api.entity import list_entities as list_entities_t
51
51
  from .api.id_source import list_id_source as list_id_source_t
52
52
  from .api.entity import lock_entity as lock_entity_t
53
+ from .api.recipes import lock_recipes as lock_recipes_t
53
54
  from .api.id_source import match_id_source as match_id_source_t
54
55
  from . import outputs as outputs_t
55
56
  from . import permissions as permissions_t
@@ -75,6 +76,7 @@ from .api.inputs import set_input_subcategories as set_input_subcategories_t
75
76
  from .api.inputs import set_intermediate_type as set_intermediate_type_t
76
77
  from .api.recipes import set_recipe_inputs as set_recipe_inputs_t
77
78
  from .api.recipes import set_recipe_metadata as set_recipe_metadata_t
79
+ from .api.recipes import set_recipe_output_annotations as set_recipe_output_annotations_t
78
80
  from .api.recipes import set_recipe_outputs as set_recipe_outputs_t
79
81
  from .api.recipes import set_recipe_tags as set_recipe_tags_t
80
82
  from .api.entity import set_values as set_values_t
@@ -82,6 +84,7 @@ from .api.entity import transition_entity_phase as transition_entity_phase_t
82
84
  from .api.recipes import unarchive_recipes as unarchive_recipes_t
83
85
  from . import units as units_t
84
86
  from .api.entity import unlock_entity as unlock_entity_t
87
+ from .api.recipes import unlock_recipes as unlock_recipes_t
85
88
  from .api.material_families import update_entity_material_families as update_entity_material_families_t
86
89
  from .api.field_options import upsert_field_options as upsert_field_options_t
87
90
  from . import users as users_t
@@ -136,6 +139,7 @@ __all__: list[str] = [
136
139
  "list_entities_t",
137
140
  "list_id_source_t",
138
141
  "lock_entity_t",
142
+ "lock_recipes_t",
139
143
  "match_id_source_t",
140
144
  "outputs_t",
141
145
  "permissions_t",
@@ -161,6 +165,7 @@ __all__: list[str] = [
161
165
  "set_intermediate_type_t",
162
166
  "set_recipe_inputs_t",
163
167
  "set_recipe_metadata_t",
168
+ "set_recipe_output_annotations_t",
164
169
  "set_recipe_outputs_t",
165
170
  "set_recipe_tags_t",
166
171
  "set_values_t",
@@ -168,6 +173,7 @@ __all__: list[str] = [
168
173
  "unarchive_recipes_t",
169
174
  "units_t",
170
175
  "unlock_entity_t",
176
+ "unlock_recipes_t",
171
177
  "update_entity_material_families_t",
172
178
  "upsert_field_options_t",
173
179
  "users_t",
@@ -32,8 +32,8 @@ ENDPOINT_PATH = "api/external/entity/external_list_entities"
32
32
  )
33
33
  @dataclass(kw_only=True)
34
34
  class Arguments:
35
- entity_type: entity_t.EntityType
36
35
  config_reference: str
36
+ entity_type: typing.Optional[entity_t.EntityType] = None
37
37
  attributes: typing.Optional[dict[OpaqueKey, base_t.JsonValue]] = None
38
38
  offset: typing.Optional[typing.Optional[int]] = None
39
39
  limit: typing.Optional[typing.Optional[int]] = None
@@ -24,8 +24,10 @@ __all__: list[str] = [
24
24
  "RecipeInputEdit",
25
25
  "RecipeInputEditAddInput",
26
26
  "RecipeInputEditBase",
27
+ "RecipeInputEditChangeBasisViewed",
27
28
  "RecipeInputEditClearInputs",
28
29
  "RecipeInputEditInputBase",
30
+ "RecipeInputEditSetLot",
29
31
  "RecipeInputEditType",
30
32
  "RecipeInputEditUpdateAnnotations",
31
33
  "RecipeInputEditUpsertInput",
@@ -41,6 +43,8 @@ class RecipeInputEditType(StrEnum):
41
43
  UPSERT_INPUT = "upsert_input"
42
44
  ADD_INPUT = "add_input"
43
45
  UPDATE_ANNOTATIONS = "update_annotations"
46
+ SET_LOT = "set_lot"
47
+ CHANGE_BASIS = "change_basis"
44
48
 
45
49
 
46
50
  # DO NOT MODIFY -- This file is generated by type_spec
@@ -72,6 +76,15 @@ class RecipeInputEditInputBase(RecipeInputEditBase):
72
76
  calculation_key: typing.Optional[identifier_t.IdentifierKey] = None
73
77
 
74
78
 
79
+ # DO NOT MODIFY -- This file is generated by type_spec
80
+ @serial_class(
81
+ parse_require={"type"},
82
+ )
83
+ @dataclass(kw_only=True)
84
+ class RecipeInputEditChangeBasisViewed(RecipeInputEditInputBase):
85
+ type: typing.Literal[RecipeInputEditType.CHANGE_BASIS] = RecipeInputEditType.CHANGE_BASIS
86
+
87
+
75
88
  # DO NOT MODIFY -- This file is generated by type_spec
76
89
  @serial_class(
77
90
  parse_require={"type"},
@@ -91,6 +104,17 @@ class RecipeInputEditAddInput(RecipeInputEditInputBase):
91
104
  type: typing.Literal[RecipeInputEditType.ADD_INPUT] = RecipeInputEditType.ADD_INPUT
92
105
 
93
106
 
107
+ # DO NOT MODIFY -- This file is generated by type_spec
108
+ @serial_class(
109
+ parse_require={"type"},
110
+ )
111
+ @dataclass(kw_only=True)
112
+ class RecipeInputEditSetLot(RecipeInputEditBase):
113
+ type: typing.Literal[RecipeInputEditType.SET_LOT] = RecipeInputEditType.SET_LOT
114
+ ingredient_key: identifier_t.IdentifierKey
115
+ ingredient_lot_recipe_key: identifier_t.IdentifierKey
116
+
117
+
94
118
  # DO NOT MODIFY -- This file is generated by type_spec
95
119
  @serial_class(
96
120
  to_string_values={"lower_value", "upper_value"},
@@ -116,7 +140,7 @@ class RecipeInputEditUpdateAnnotations(RecipeInputEditInputBase):
116
140
 
117
141
  # DO NOT MODIFY -- This file is generated by type_spec
118
142
  RecipeInputEdit = typing.Annotated[
119
- typing.Union[RecipeInputEditClearInputs, RecipeInputEditUpsertInput, RecipeInputEditAddInput, RecipeInputEditUpdateAnnotations],
143
+ typing.Union[RecipeInputEditClearInputs, RecipeInputEditUpsertInput, RecipeInputEditAddInput, RecipeInputEditUpdateAnnotations, RecipeInputEditSetLot, RecipeInputEditChangeBasisViewed],
120
144
  serial_union_annotation(
121
145
  discriminator="type",
122
146
  discriminator_map={
@@ -124,6 +148,8 @@ RecipeInputEdit = typing.Annotated[
124
148
  "upsert_input": RecipeInputEditUpsertInput,
125
149
  "add_input": RecipeInputEditAddInput,
126
150
  "update_annotations": RecipeInputEditUpdateAnnotations,
151
+ "set_lot": RecipeInputEditSetLot,
152
+ "change_basis": RecipeInputEditChangeBasisViewed,
127
153
  },
128
154
  ),
129
155
  ]
@@ -0,0 +1,53 @@
1
+ # DO NOT MODIFY -- This file is generated by type_spec
2
+ # flake8: noqa: F821
3
+ # ruff: noqa: E402
4
+ # fmt: off
5
+ # isort: skip_file
6
+ from __future__ import annotations
7
+ import typing # noqa: F401
8
+ import datetime # noqa: F401
9
+ from decimal import Decimal # noqa: F401
10
+ from pkgs.strenum_compat import StrEnum
11
+ from dataclasses import dataclass
12
+ from ... import identifier as identifier_t
13
+
14
+ __all__: list[str] = [
15
+ "Arguments",
16
+ "Data",
17
+ "ENDPOINT_METHOD",
18
+ "ENDPOINT_PATH",
19
+ "RecipeLockBase",
20
+ "RecipeLockType",
21
+ ]
22
+
23
+ ENDPOINT_METHOD = "POST"
24
+ ENDPOINT_PATH = "api/external/recipes/lock_recipes"
25
+
26
+
27
+ # DO NOT MODIFY -- This file is generated by type_spec
28
+ class RecipeLockType(StrEnum):
29
+ ALL = "all"
30
+ INPUTS_ONLY = "inputs_only"
31
+
32
+
33
+ # DO NOT MODIFY -- This file is generated by type_spec
34
+ @dataclass(kw_only=True)
35
+ class RecipeLockBase:
36
+ recipe: identifier_t.IdentifierKey
37
+
38
+
39
+ # DO NOT MODIFY -- This file is generated by type_spec
40
+ @dataclass(kw_only=True)
41
+ class Arguments:
42
+ type: RecipeLockType = RecipeLockType.ALL
43
+ recipes: list[identifier_t.IdentifierKey]
44
+ globally_removable: bool
45
+ lock_samples: typing.Optional[bool] = None
46
+ comments: typing.Optional[str] = None
47
+
48
+
49
+ # DO NOT MODIFY -- This file is generated by type_spec
50
+ @dataclass(kw_only=True)
51
+ class Data:
52
+ pass
53
+ # DO NOT MODIFY -- This file is generated by type_spec
@@ -0,0 +1,102 @@
1
+ # DO NOT MODIFY -- This file is generated by type_spec
2
+ # flake8: noqa: F821
3
+ # ruff: noqa: E402
4
+ # fmt: off
5
+ # isort: skip_file
6
+ from __future__ import annotations
7
+ import typing # noqa: F401
8
+ import datetime # noqa: F401
9
+ from decimal import Decimal # noqa: F401
10
+ from pkgs.strenum_compat import StrEnum
11
+ from dataclasses import dataclass
12
+ from pkgs.serialization import serial_class
13
+ from pkgs.serialization import serial_union_annotation
14
+ from ... import base as base_t
15
+ from ... import identifier as identifier_t
16
+
17
+ __all__: list[str] = [
18
+ "AnnotationEdit",
19
+ "AnnotationUpdateType",
20
+ "Arguments",
21
+ "Data",
22
+ "ENDPOINT_METHOD",
23
+ "ENDPOINT_PATH",
24
+ "RecipeOutputEditBase",
25
+ "RecipeOutputMergeAnnotations",
26
+ "RecipeOutputReplaceAnnotations",
27
+ "RecipeOutputUpdateAnnotations",
28
+ ]
29
+
30
+ ENDPOINT_METHOD = "POST"
31
+ ENDPOINT_PATH = "api/external/recipes/set_recipe_output_annotations"
32
+
33
+
34
+ # DO NOT MODIFY -- This file is generated by type_spec
35
+ @serial_class(
36
+ to_string_values={"lower_value", "upper_value"},
37
+ )
38
+ @dataclass(kw_only=True)
39
+ class AnnotationEdit:
40
+ annotation_type_key: identifier_t.IdentifierKey
41
+ lower_value: typing.Optional[Decimal] = None
42
+ upper_value: typing.Optional[Decimal] = None
43
+
44
+
45
+ # DO NOT MODIFY -- This file is generated by type_spec
46
+ class AnnotationUpdateType(StrEnum):
47
+ MERGE = "merge"
48
+ REPLACE = "replace"
49
+
50
+
51
+ # DO NOT MODIFY -- This file is generated by type_spec
52
+ @dataclass(kw_only=True)
53
+ class RecipeOutputEditBase:
54
+ recipe_id: base_t.ObjectId
55
+ output_id: base_t.ObjectId
56
+ experiment_num: int
57
+ annotations: list[AnnotationEdit]
58
+ condition_id: typing.Optional[base_t.ObjectId] = None
59
+
60
+
61
+ # DO NOT MODIFY -- This file is generated by type_spec
62
+ @serial_class(
63
+ parse_require={"type"},
64
+ )
65
+ @dataclass(kw_only=True)
66
+ class RecipeOutputMergeAnnotations(RecipeOutputEditBase):
67
+ type: typing.Literal[AnnotationUpdateType.MERGE] = AnnotationUpdateType.MERGE
68
+
69
+
70
+ # DO NOT MODIFY -- This file is generated by type_spec
71
+ @serial_class(
72
+ parse_require={"type"},
73
+ )
74
+ @dataclass(kw_only=True)
75
+ class RecipeOutputReplaceAnnotations(RecipeOutputEditBase):
76
+ type: typing.Literal[AnnotationUpdateType.REPLACE] = AnnotationUpdateType.REPLACE
77
+
78
+
79
+ # DO NOT MODIFY -- This file is generated by type_spec
80
+ RecipeOutputUpdateAnnotations = typing.Annotated[
81
+ typing.Union[RecipeOutputMergeAnnotations, RecipeOutputReplaceAnnotations],
82
+ serial_union_annotation(
83
+ discriminator="type",
84
+ discriminator_map={
85
+ "merge": RecipeOutputMergeAnnotations,
86
+ "replace": RecipeOutputReplaceAnnotations,
87
+ },
88
+ ),
89
+ ]
90
+
91
+
92
+ # DO NOT MODIFY -- This file is generated by type_spec
93
+ @dataclass(kw_only=True)
94
+ class Arguments:
95
+ updates: list[RecipeOutputUpdateAnnotations]
96
+
97
+
98
+ # DO NOT MODIFY -- This file is generated by type_spec
99
+ @dataclass(kw_only=True)
100
+ class Data:
101
+ pass
102
+ # DO NOT MODIFY -- This file is generated by type_spec
@@ -0,0 +1,43 @@
1
+ # DO NOT MODIFY -- This file is generated by type_spec
2
+ # flake8: noqa: F821
3
+ # ruff: noqa: E402
4
+ # fmt: off
5
+ # isort: skip_file
6
+ from __future__ import annotations
7
+ import typing # noqa: F401
8
+ import datetime # noqa: F401
9
+ from decimal import Decimal # noqa: F401
10
+ from pkgs.strenum_compat import StrEnum
11
+ from dataclasses import dataclass
12
+ from ... import identifier as identifier_t
13
+
14
+ __all__: list[str] = [
15
+ "Arguments",
16
+ "Data",
17
+ "ENDPOINT_METHOD",
18
+ "ENDPOINT_PATH",
19
+ "RecipeUnlockType",
20
+ ]
21
+
22
+ ENDPOINT_METHOD = "POST"
23
+ ENDPOINT_PATH = "api/external/recipes/unlock_recipes"
24
+
25
+
26
+ # DO NOT MODIFY -- This file is generated by type_spec
27
+ class RecipeUnlockType(StrEnum):
28
+ STANDARD = "standard"
29
+
30
+
31
+ # DO NOT MODIFY -- This file is generated by type_spec
32
+ @dataclass(kw_only=True)
33
+ class Arguments:
34
+ type: RecipeUnlockType = RecipeUnlockType.STANDARD
35
+ recipes: list[identifier_t.IdentifierKey]
36
+ unlock_samples: typing.Optional[bool] = None
37
+
38
+
39
+ # DO NOT MODIFY -- This file is generated by type_spec
40
+ @dataclass(kw_only=True)
41
+ class Data:
42
+ pass
43
+ # DO NOT MODIFY -- This file is generated by type_spec
@@ -27,6 +27,8 @@ class AsyncBatchRequestPath(StrEnum):
27
27
  SET_RECIPE_TAGS = "recipes/set_recipe_tags"
28
28
  EDIT_RECIPE_INPUTS = "recipes/edit_recipe_inputs"
29
29
  ARCHIVE_RECIPES = "recipes/archive"
30
+ LOCK_RECIPES = "recipes/lock_recipes"
31
+ UNLOCK_RECIPES = "recipes/unlock_recipes"
30
32
 
31
33
 
32
34
  # DO NOT MODIFY -- This file is generated by type_spec