UncountablePythonSDK 0.0.36__tar.gz → 0.0.38__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 (199) hide show
  1. {uncountablepythonsdk-0.0.36/UncountablePythonSDK.egg-info → uncountablepythonsdk-0.0.38}/PKG-INFO +1 -1
  2. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38/UncountablePythonSDK.egg-info}/PKG-INFO +1 -1
  3. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/UncountablePythonSDK.egg-info/SOURCES.txt +1 -0
  4. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/uncountable/core/client.py +37 -22
  5. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/uncountable/types/__init__.py +2 -0
  6. uncountablepythonsdk-0.0.38/uncountable/types/api/recipe_links/remove_recipe_link.py +38 -0
  7. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/uncountable/types/client_base.py +26 -0
  8. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/.github/workflows/documentation.yml +0 -0
  9. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/.github/workflows/publish.yml +0 -0
  10. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/.gitignore +0 -0
  11. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/README.md +0 -0
  12. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/UncountablePythonSDK.egg-info/dependency_links.txt +0 -0
  13. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/UncountablePythonSDK.egg-info/requires.txt +0 -0
  14. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/UncountablePythonSDK.egg-info/top_level.txt +0 -0
  15. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/docs/.gitignore +0 -0
  16. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/docs/conf.py +0 -0
  17. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/docs/index.md +0 -0
  18. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/docs/justfile +0 -0
  19. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/docs/quickstart.md +0 -0
  20. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/docs/requirements.txt +0 -0
  21. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/docs/static/favicons/android-chrome-192x192.png +0 -0
  22. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/docs/static/favicons/android-chrome-512x512.png +0 -0
  23. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/docs/static/favicons/apple-touch-icon.png +0 -0
  24. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/docs/static/favicons/browserconfig.xml +0 -0
  25. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/docs/static/favicons/favicon-16x16.png +0 -0
  26. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/docs/static/favicons/favicon-32x32.png +0 -0
  27. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/docs/static/favicons/manifest.json +0 -0
  28. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/docs/static/favicons/mstile-150x150.png +0 -0
  29. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/docs/static/favicons/safari-pinned-tab.svg +0 -0
  30. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/docs/static/logo_blue.png +0 -0
  31. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/examples/async_batch.py +0 -0
  32. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/examples/create_entity.py +0 -0
  33. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/examples/edit_recipe_inputs.py +0 -0
  34. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/examples/upload_files.py +0 -0
  35. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/pkgs/__init__.py +0 -0
  36. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/pkgs/argument_parser/__init__.py +0 -0
  37. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/pkgs/argument_parser/_is_enum.py +0 -0
  38. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/pkgs/argument_parser/_is_namedtuple.py +0 -0
  39. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/pkgs/argument_parser/argument_parser.py +0 -0
  40. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/pkgs/argument_parser/case_convert.py +0 -0
  41. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/pkgs/serialization/__init__.py +0 -0
  42. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/pkgs/serialization/missing_sentry.py +0 -0
  43. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/pkgs/serialization/opaque_key.py +0 -0
  44. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/pkgs/serialization/serial_class.py +0 -0
  45. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/pkgs/serialization/serial_union.py +0 -0
  46. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/pkgs/serialization_util/__init__.py +0 -0
  47. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/pkgs/serialization_util/_get_type_for_serialization.py +0 -0
  48. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/pkgs/serialization_util/convert_to_snakecase.py +0 -0
  49. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/pkgs/serialization_util/serialization_helpers.py +0 -0
  50. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/pkgs/strenum_compat/__init__.py +0 -0
  51. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/pkgs/strenum_compat/strenum_compat.py +0 -0
  52. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/pkgs/type_spec/__init__.py +0 -0
  53. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/pkgs/type_spec/__main__.py +0 -0
  54. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/pkgs/type_spec/actions_registry/__init__.py +0 -0
  55. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/pkgs/type_spec/actions_registry/__main__.py +0 -0
  56. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/pkgs/type_spec/actions_registry/emit_typescript.py +0 -0
  57. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/pkgs/type_spec/builder.py +0 -0
  58. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/pkgs/type_spec/config.py +0 -0
  59. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/pkgs/type_spec/emit_io_ts.py +0 -0
  60. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/pkgs/type_spec/emit_open_api.py +0 -0
  61. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/pkgs/type_spec/emit_open_api_util.py +0 -0
  62. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/pkgs/type_spec/emit_python.py +0 -0
  63. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/pkgs/type_spec/emit_typescript.py +0 -0
  64. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/pkgs/type_spec/emit_typescript_util.py +0 -0
  65. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/pkgs/type_spec/load_types.py +0 -0
  66. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/pkgs/type_spec/open_api_util.py +0 -0
  67. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/pkgs/type_spec/parts/base.py.prepart +0 -0
  68. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/pkgs/type_spec/parts/base.ts.prepart +0 -0
  69. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/pkgs/type_spec/test.py +0 -0
  70. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/pkgs/type_spec/type_info/__main__.py +0 -0
  71. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/pkgs/type_spec/type_info/emit_type_info.py +0 -0
  72. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/pkgs/type_spec/util.py +0 -0
  73. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/pkgs/type_spec/value_spec/__init__.py +0 -0
  74. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/pkgs/type_spec/value_spec/__main__.py +0 -0
  75. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/pkgs/type_spec/value_spec/convert_type.py +0 -0
  76. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/pkgs/type_spec/value_spec/emit_python.py +0 -0
  77. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/pkgs/type_spec/value_spec/types.py +0 -0
  78. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/pyproject.toml +0 -0
  79. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/setup.cfg +0 -0
  80. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/uncountable/__init__.py +0 -0
  81. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/uncountable/core/__init__.py +0 -0
  82. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/uncountable/core/async_batch.py +0 -0
  83. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/uncountable/core/file_upload.py +0 -0
  84. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/uncountable/core/types.py +0 -0
  85. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/uncountable/integration/__init__.py +0 -0
  86. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/uncountable/integration/construct_client.py +0 -0
  87. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/uncountable/integration/cron.py +0 -0
  88. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/uncountable/integration/db/__init__.py +0 -0
  89. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/uncountable/integration/db/connect.py +0 -0
  90. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/uncountable/integration/entrypoint.py +0 -0
  91. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/uncountable/integration/executors/__init__.py +0 -0
  92. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/uncountable/integration/executors/script_executor.py +0 -0
  93. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/uncountable/integration/job.py +0 -0
  94. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/uncountable/integration/server.py +0 -0
  95. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/uncountable/integration/types.py +0 -0
  96. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/uncountable/py.typed +0 -0
  97. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/uncountable/types/api/__init__.py +0 -0
  98. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/uncountable/types/api/batch/__init__.py +0 -0
  99. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/uncountable/types/api/batch/execute_batch.py +0 -0
  100. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/uncountable/types/api/batch/execute_batch_load_async.py +0 -0
  101. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/uncountable/types/api/chemical/__init__.py +0 -0
  102. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/uncountable/types/api/chemical/convert_chemical_formats.py +0 -0
  103. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/uncountable/types/api/entity/__init__.py +0 -0
  104. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/uncountable/types/api/entity/create_entities.py +0 -0
  105. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/uncountable/types/api/entity/create_entity.py +0 -0
  106. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/uncountable/types/api/entity/get_entities_data.py +0 -0
  107. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/uncountable/types/api/entity/list_entities.py +0 -0
  108. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/uncountable/types/api/entity/lock_entity.py +0 -0
  109. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/uncountable/types/api/entity/resolve_entity_ids.py +0 -0
  110. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/uncountable/types/api/entity/set_values.py +0 -0
  111. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/uncountable/types/api/entity/transition_entity_phase.py +0 -0
  112. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/uncountable/types/api/entity/unlock_entity.py +0 -0
  113. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/uncountable/types/api/field_options/__init__.py +0 -0
  114. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/uncountable/types/api/field_options/upsert_field_options.py +0 -0
  115. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/uncountable/types/api/id_source/__init__.py +0 -0
  116. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/uncountable/types/api/id_source/list_id_source.py +0 -0
  117. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/uncountable/types/api/id_source/match_id_source.py +0 -0
  118. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/uncountable/types/api/input_groups/__init__.py +0 -0
  119. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/uncountable/types/api/input_groups/get_input_group_names.py +0 -0
  120. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/uncountable/types/api/inputs/__init__.py +0 -0
  121. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/uncountable/types/api/inputs/create_inputs.py +0 -0
  122. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/uncountable/types/api/inputs/get_input_data.py +0 -0
  123. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/uncountable/types/api/inputs/get_input_names.py +0 -0
  124. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/uncountable/types/api/inputs/get_inputs_data.py +0 -0
  125. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/uncountable/types/api/inputs/set_input_attribute_values.py +0 -0
  126. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/uncountable/types/api/inputs/set_input_category.py +0 -0
  127. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/uncountable/types/api/inputs/set_input_subcategories.py +0 -0
  128. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/uncountable/types/api/inputs/set_intermediate_type.py +0 -0
  129. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/uncountable/types/api/material_families/__init__.py +0 -0
  130. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/uncountable/types/api/material_families/update_entity_material_families.py +0 -0
  131. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/uncountable/types/api/outputs/__init__.py +0 -0
  132. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/uncountable/types/api/outputs/get_output_data.py +0 -0
  133. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/uncountable/types/api/outputs/get_output_names.py +0 -0
  134. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/uncountable/types/api/outputs/resolve_output_conditions.py +0 -0
  135. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/uncountable/types/api/permissions/__init__.py +0 -0
  136. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/uncountable/types/api/permissions/set_core_permissions.py +0 -0
  137. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/uncountable/types/api/project/__init__.py +0 -0
  138. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/uncountable/types/api/project/get_projects.py +0 -0
  139. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/uncountable/types/api/project/get_projects_data.py +0 -0
  140. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/uncountable/types/api/recipe_links/__init__.py +0 -0
  141. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/uncountable/types/api/recipe_links/create_recipe_link.py +0 -0
  142. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/uncountable/types/api/recipe_metadata/__init__.py +0 -0
  143. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/uncountable/types/api/recipe_metadata/get_recipe_metadata_data.py +0 -0
  144. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/uncountable/types/api/recipes/__init__.py +0 -0
  145. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/uncountable/types/api/recipes/add_recipe_to_project.py +0 -0
  146. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/uncountable/types/api/recipes/archive_recipes.py +0 -0
  147. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/uncountable/types/api/recipes/associate_recipe_as_input.py +0 -0
  148. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/uncountable/types/api/recipes/associate_recipe_as_lot.py +0 -0
  149. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/uncountable/types/api/recipes/create_recipe.py +0 -0
  150. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/uncountable/types/api/recipes/create_recipes.py +0 -0
  151. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/uncountable/types/api/recipes/disassociate_recipe_as_input.py +0 -0
  152. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/uncountable/types/api/recipes/edit_recipe_inputs.py +0 -0
  153. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/uncountable/types/api/recipes/get_curve.py +0 -0
  154. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/uncountable/types/api/recipes/get_recipe_calculations.py +0 -0
  155. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/uncountable/types/api/recipes/get_recipe_links.py +0 -0
  156. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/uncountable/types/api/recipes/get_recipe_names.py +0 -0
  157. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/uncountable/types/api/recipes/get_recipe_output_metadata.py +0 -0
  158. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/uncountable/types/api/recipes/get_recipes_data.py +0 -0
  159. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/uncountable/types/api/recipes/lock_recipes.py +0 -0
  160. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/uncountable/types/api/recipes/remove_recipe_from_project.py +0 -0
  161. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/uncountable/types/api/recipes/set_recipe_inputs.py +0 -0
  162. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/uncountable/types/api/recipes/set_recipe_metadata.py +0 -0
  163. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/uncountable/types/api/recipes/set_recipe_output_annotations.py +0 -0
  164. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/uncountable/types/api/recipes/set_recipe_outputs.py +0 -0
  165. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/uncountable/types/api/recipes/set_recipe_tags.py +0 -0
  166. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/uncountable/types/api/recipes/unarchive_recipes.py +0 -0
  167. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/uncountable/types/api/recipes/unlock_recipes.py +0 -0
  168. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/uncountable/types/api/triggers/__init__.py +0 -0
  169. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/uncountable/types/api/triggers/run_trigger.py +0 -0
  170. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/uncountable/types/async_batch.py +0 -0
  171. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/uncountable/types/async_batch_processor.py +0 -0
  172. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/uncountable/types/base.py +0 -0
  173. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/uncountable/types/calculations.py +0 -0
  174. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/uncountable/types/chemical_structure.py +0 -0
  175. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/uncountable/types/curves.py +0 -0
  176. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/uncountable/types/entity.py +0 -0
  177. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/uncountable/types/experiment_groups.py +0 -0
  178. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/uncountable/types/field_values.py +0 -0
  179. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/uncountable/types/fields.py +0 -0
  180. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/uncountable/types/id_source.py +0 -0
  181. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/uncountable/types/identifier.py +0 -0
  182. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/uncountable/types/input_attributes.py +0 -0
  183. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/uncountable/types/inputs.py +0 -0
  184. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/uncountable/types/outputs.py +0 -0
  185. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/uncountable/types/permissions.py +0 -0
  186. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/uncountable/types/phases.py +0 -0
  187. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/uncountable/types/post_base.py +0 -0
  188. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/uncountable/types/recipe_identifiers.py +0 -0
  189. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/uncountable/types/recipe_inputs.py +0 -0
  190. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/uncountable/types/recipe_links.py +0 -0
  191. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/uncountable/types/recipe_metadata.py +0 -0
  192. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/uncountable/types/recipe_output_metadata.py +0 -0
  193. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/uncountable/types/recipe_tags.py +0 -0
  194. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/uncountable/types/recipe_workflow_steps.py +0 -0
  195. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/uncountable/types/recipes.py +0 -0
  196. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/uncountable/types/response.py +0 -0
  197. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/uncountable/types/units.py +0 -0
  198. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/uncountable/types/users.py +0 -0
  199. {uncountablepythonsdk-0.0.36 → uncountablepythonsdk-0.0.38}/uncountable/types/workflows.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: UncountablePythonSDK
3
- Version: 0.0.36
3
+ Version: 0.0.38
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.36
3
+ Version: 0.0.38
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
@@ -166,6 +166,7 @@ uncountable/types/api/project/get_projects.py
166
166
  uncountable/types/api/project/get_projects_data.py
167
167
  uncountable/types/api/recipe_links/__init__.py
168
168
  uncountable/types/api/recipe_links/create_recipe_link.py
169
+ uncountable/types/api/recipe_links/remove_recipe_link.py
169
170
  uncountable/types/api/recipe_metadata/__init__.py
170
171
  uncountable/types/api/recipe_metadata/get_recipe_metadata_data.py
171
172
  uncountable/types/api/recipes/__init__.py
@@ -4,6 +4,7 @@ import typing
4
4
  from dataclasses import dataclass
5
5
  from datetime import datetime, timedelta
6
6
  from enum import StrEnum
7
+ from importlib.metadata import PackageNotFoundError, version
7
8
  from urllib.parse import urljoin
8
9
  from uuid import uuid4
9
10
 
@@ -20,6 +21,13 @@ from .types import AuthDetailsAll, AuthDetailsApiKey, AuthDetailsOAuth
20
21
 
21
22
  DT = typing.TypeVar("DT")
22
23
  UNC_REQUEST_ID_HEADER = "X-UNC-REQUEST-ID"
24
+ UNC_SDK_VERSION_HEADER = "X-UNC-SDK-VERSION"
25
+
26
+
27
+ try:
28
+ __version__ = version("uncountable")
29
+ except PackageNotFoundError:
30
+ __version__ = "unknown"
23
31
 
24
32
 
25
33
  class EndpointMethod(StrEnum):
@@ -52,6 +60,8 @@ HTTPRequest = HTTPPostRequest | HTTPGetRequest
52
60
  @dataclass(kw_only=True)
53
61
  class ClientConfig:
54
62
  allow_insecure_tls: bool = False
63
+ extra_headers: dict[str, str] | None = None
64
+ transform_request: typing.Callable[[requests.Request], requests.Request] | None = None
55
65
 
56
66
 
57
67
  OAUTH_REFRESH_WINDOW_SECONDS = 60 * 5
@@ -136,6 +146,7 @@ class Client(ClientMethods):
136
146
  _file_uploader: FileUploader
137
147
  _cfg: ClientConfig
138
148
  _oauth_bearer_token_cache: OAuthBearerTokenCache | None = None
149
+ _session: requests.Session
139
150
 
140
151
  def __init__(
141
152
  self,
@@ -148,6 +159,8 @@ class Client(ClientMethods):
148
159
  self._base_url = base_url
149
160
  self._file_uploader = FileUploader(self._base_url, self._auth_details)
150
161
  self._cfg = config or ClientConfig()
162
+ self._session = requests.Session()
163
+ self._session.verify = not self._cfg.allow_insecure_tls
151
164
 
152
165
  def _get_response_json(
153
166
  self, response: requests.Response, request_id: str
@@ -157,7 +170,7 @@ class Client(ClientMethods):
157
170
  try:
158
171
  data = response.json()
159
172
  if "error" in data:
160
- extra_details = data["error"]
173
+ extra_details = data
161
174
  except JSONDecodeError:
162
175
  pass
163
176
  raise APIResponseError.construct_error(
@@ -168,6 +181,15 @@ class Client(ClientMethods):
168
181
  except JSONDecodeError as e:
169
182
  raise SDKError("unable to process response", request_id=request_id) from e
170
183
 
184
+ def _send_request(self, request: requests.Request) -> requests.Response:
185
+ if self._cfg.extra_headers is not None:
186
+ request.headers = {**request.headers, **self._cfg.extra_headers}
187
+ if self._cfg.transform_request is not None:
188
+ request = self._cfg.transform_request(request)
189
+ prepared_request = request.prepare()
190
+ response = self._session.send(prepared_request)
191
+ return response
192
+
171
193
  def do_request(self, *, api_request: APIRequest, return_type: type[DT]) -> DT:
172
194
  request_id = str(uuid4())
173
195
  http_request = self._build_http_request(
@@ -175,21 +197,15 @@ class Client(ClientMethods):
175
197
  )
176
198
  match http_request:
177
199
  case HTTPGetRequest():
178
- response = requests.get(
179
- http_request.url,
180
- headers=http_request.headers,
181
- params=http_request.query_params,
182
- verify=not self._cfg.allow_insecure_tls,
183
- )
200
+ request = requests.Request("GET", http_request.url)
201
+ request.params = http_request.query_params
184
202
  case HTTPPostRequest():
185
- response = requests.post(
186
- http_request.url,
187
- headers=http_request.headers,
188
- data=http_request.body,
189
- verify=not self._cfg.allow_insecure_tls,
190
- )
203
+ request = requests.Request("POST", http_request.url)
204
+ request.data = http_request.body
191
205
  case _:
192
206
  typing.assert_never(http_request)
207
+ request.headers = http_request.headers
208
+ response = self._send_request(request)
193
209
  response_data = self._get_response_json(response, request_id=request_id)
194
210
  cached_parser = self._get_cached_parser(return_type)
195
211
  try:
@@ -212,15 +228,13 @@ class Client(ClientMethods):
212
228
  < OAUTH_REFRESH_WINDOW_SECONDS
213
229
  ):
214
230
  refresh_url = urljoin(self._base_url, "/token/get_bearer_token")
215
- response = requests.post(
216
- refresh_url,
217
- data={
218
- "client_secret": oauth_details.refresh_token,
219
- "scope": oauth_details.scope,
220
- "grant_type": "client_credentials",
221
- },
222
- verify=not self._cfg.allow_insecure_tls,
223
- )
231
+ request = requests.Request("POST", refresh_url)
232
+ request.data = {
233
+ "client_secret": oauth_details.refresh_token,
234
+ "scope": oauth_details.scope,
235
+ "grant_type": "client_credentials",
236
+ }
237
+ response = self._send_request(request)
224
238
  data = self._get_response_json(response, request_id=str(uuid4()))
225
239
  token_data = oauth_bearer_token_data_parser.parse_storage(data)
226
240
  self._oauth_bearer_token_cache = OAuthBearerTokenCache(
@@ -247,6 +261,7 @@ class Client(ClientMethods):
247
261
  ) -> HTTPRequest:
248
262
  headers = self._build_auth_headers()
249
263
  headers[UNC_REQUEST_ID_HEADER] = request_id
264
+ headers[UNC_SDK_VERSION_HEADER] = __version__
250
265
  method = api_request.method.lower()
251
266
  data = {"data": json.dumps(serialize_for_api(api_request.args))}
252
267
  match method:
@@ -65,6 +65,7 @@ from . import recipe_tags as recipe_tags_t
65
65
  from . import recipe_workflow_steps as recipe_workflow_steps_t
66
66
  from . import recipes as recipes_t
67
67
  from .api.recipes import remove_recipe_from_project as remove_recipe_from_project_t
68
+ from .api.recipe_links import remove_recipe_link as remove_recipe_link_t
68
69
  from .api.entity import resolve_entity_ids as resolve_entity_ids_t
69
70
  from .api.outputs import resolve_output_conditions as resolve_output_conditions_t
70
71
  from . import response as response_t
@@ -154,6 +155,7 @@ __all__: list[str] = [
154
155
  "recipe_workflow_steps_t",
155
156
  "recipes_t",
156
157
  "remove_recipe_from_project_t",
158
+ "remove_recipe_link_t",
157
159
  "resolve_entity_ids_t",
158
160
  "resolve_output_conditions_t",
159
161
  "response_t",
@@ -0,0 +1,38 @@
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 dataclasses import dataclass
11
+ from ... import async_batch as async_batch_t
12
+ from ... import identifier as identifier_t
13
+ from ... import recipe_links as recipe_links_t
14
+
15
+ __all__: list[str] = [
16
+ "Arguments",
17
+ "Data",
18
+ "ENDPOINT_METHOD",
19
+ "ENDPOINT_PATH",
20
+ ]
21
+
22
+ ENDPOINT_METHOD = "POST"
23
+ ENDPOINT_PATH = "api/external/recipe_links/remove_recipe_link"
24
+
25
+
26
+ # DO NOT MODIFY -- This file is generated by type_spec
27
+ @dataclass(kw_only=True)
28
+ class Arguments:
29
+ recipe_from_key: identifier_t.IdentifierKey
30
+ recipe_to_key: identifier_t.IdentifierKey
31
+ link_type: typing.Union[typing.Literal[recipe_links_t.RecipeLinkType.CHILD], typing.Literal[recipe_links_t.RecipeLinkType.CONTROL], typing.Literal[recipe_links_t.RecipeLinkType.USER_LINK]]
32
+
33
+
34
+ # DO NOT MODIFY -- This file is generated by type_spec
35
+ @dataclass(kw_only=True)
36
+ class Data(async_batch_t.AsyncBatchActionReturn):
37
+ pass
38
+ # DO NOT MODIFY -- This file is generated by type_spec
@@ -58,6 +58,7 @@ from uncountable.types import recipe_links as recipe_links_t
58
58
  from uncountable.types import recipe_metadata as recipe_metadata_t
59
59
  from uncountable.types import recipe_workflow_steps as recipe_workflow_steps_t
60
60
  import uncountable.types.api.recipes.remove_recipe_from_project as remove_recipe_from_project_t
61
+ import uncountable.types.api.recipe_links.remove_recipe_link as remove_recipe_link_t
61
62
  import uncountable.types.api.entity.resolve_entity_ids as resolve_entity_ids_t
62
63
  import uncountable.types.api.outputs.resolve_output_conditions as resolve_output_conditions_t
63
64
  import uncountable.types.api.triggers.run_trigger as run_trigger_t
@@ -987,6 +988,31 @@ class ClientMethods(ABC):
987
988
  )
988
989
  return self.do_request(api_request=api_request, return_type=remove_recipe_from_project_t.Data)
989
990
 
991
+ def remove_recipe_link(
992
+ self,
993
+ *,
994
+ recipe_from_key: identifier_t.IdentifierKey,
995
+ recipe_to_key: identifier_t.IdentifierKey,
996
+ link_type: typing.Union[typing.Literal[recipe_links_t.RecipeLinkType.CHILD], typing.Literal[recipe_links_t.RecipeLinkType.CONTROL], typing.Literal[recipe_links_t.RecipeLinkType.USER_LINK]],
997
+ ) -> remove_recipe_link_t.Data:
998
+ """Remove a link between two recipes. Skip if the link doesn't already exist
999
+
1000
+ :param recipe_from_key: Identifier for the recipe the link comes from
1001
+ :param recipe_to_key: Identifier for the recipe the link goes to
1002
+ :param link_type: The type of link being removed
1003
+ """
1004
+ args = remove_recipe_link_t.Arguments(
1005
+ recipe_from_key=recipe_from_key,
1006
+ recipe_to_key=recipe_to_key,
1007
+ link_type=link_type,
1008
+ )
1009
+ api_request = APIRequest(
1010
+ method=remove_recipe_link_t.ENDPOINT_METHOD,
1011
+ endpoint=remove_recipe_link_t.ENDPOINT_PATH,
1012
+ args=args,
1013
+ )
1014
+ return self.do_request(api_request=api_request, return_type=remove_recipe_link_t.Data)
1015
+
990
1016
  def resolve_entity_ids(
991
1017
  self,
992
1018
  *,