UncountablePythonSDK 0.0.29__tar.gz → 0.0.31__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 (245) hide show
  1. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/.github/workflows/documentation.yml +4 -4
  2. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/.github/workflows/publish.yml +5 -5
  3. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/.gitignore +5 -0
  4. {uncountablepythonsdk-0.0.29/UncountablePythonSDK.egg-info → uncountablepythonsdk-0.0.31}/PKG-INFO +4 -4
  5. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31/UncountablePythonSDK.egg-info}/PKG-INFO +4 -4
  6. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/UncountablePythonSDK.egg-info/SOURCES.txt +4 -52
  7. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/UncountablePythonSDK.egg-info/requires.txt +3 -3
  8. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/UncountablePythonSDK.egg-info/top_level.txt +0 -1
  9. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/docs/conf.py +9 -4
  10. uncountablepythonsdk-0.0.31/docs/requirements.txt +7 -0
  11. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/examples/async_batch.py +2 -3
  12. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/examples/create_entity.py +4 -7
  13. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/examples/upload_files.py +1 -1
  14. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/pkgs/argument_parser/case_convert.py +4 -3
  15. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/pkgs/serialization/serial_class.py +31 -37
  16. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/pkgs/type_spec/emit_python.py +0 -1
  17. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/pkgs/type_spec/type_info/emit_type_info.py +14 -6
  18. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/pyproject.toml +3 -3
  19. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/uncountable/__init__.py +1 -2
  20. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/uncountable/core/__init__.py +10 -3
  21. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/uncountable/core/client.py +27 -17
  22. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/uncountable/core/file_upload.py +3 -5
  23. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/uncountable/core/types.py +1 -1
  24. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/uncountable/integration/construct_client.py +1 -1
  25. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/uncountable/integration/cron.py +4 -2
  26. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/uncountable/integration/entrypoint.py +4 -5
  27. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/uncountable/integration/executors/script_executor.py +11 -5
  28. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/uncountable/integration/job.py +5 -8
  29. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/uncountable/types/__init__.py +8 -0
  30. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/uncountable/types/api/entity/list_entities.py +7 -0
  31. uncountablepythonsdk-0.0.31/uncountable/types/api/inputs/set_intermediate_type.py +43 -0
  32. uncountablepythonsdk-0.0.31/uncountable/types/api/recipes/add_recipe_to_project.py +35 -0
  33. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/uncountable/types/api/recipes/associate_recipe_as_input.py +1 -0
  34. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/uncountable/types/api/recipes/edit_recipe_inputs.py +27 -1
  35. uncountablepythonsdk-0.0.31/uncountable/types/api/recipes/remove_recipe_from_project.py +35 -0
  36. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/uncountable/types/api/recipes/set_recipe_outputs.py +2 -0
  37. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/uncountable/types/async_batch_processor.py +0 -1
  38. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/uncountable/types/client_base.py +72 -0
  39. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/uncountable/types/inputs.py +1 -0
  40. uncountablepythonsdk-0.0.31/uncountable/types/recipes.py +21 -0
  41. uncountablepythonsdk-0.0.29/docs/requirements.txt +0 -7
  42. uncountablepythonsdk-0.0.29/examples/recipe-import/importer.py +0 -39
  43. uncountablepythonsdk-0.0.29/type_spec/external/api/batch/execute_batch.yaml +0 -56
  44. uncountablepythonsdk-0.0.29/type_spec/external/api/batch/execute_batch_load_async.yaml +0 -18
  45. uncountablepythonsdk-0.0.29/type_spec/external/api/chemical/convert_chemical_formats.yaml +0 -33
  46. uncountablepythonsdk-0.0.29/type_spec/external/api/entity/create_entities.yaml +0 -45
  47. uncountablepythonsdk-0.0.29/type_spec/external/api/entity/create_entity.yaml +0 -51
  48. uncountablepythonsdk-0.0.29/type_spec/external/api/entity/get_entities_data.yaml +0 -29
  49. uncountablepythonsdk-0.0.29/type_spec/external/api/entity/list_entities.yaml +0 -52
  50. uncountablepythonsdk-0.0.29/type_spec/external/api/entity/lock_entity.yaml +0 -21
  51. uncountablepythonsdk-0.0.29/type_spec/external/api/entity/resolve_entity_ids.yaml +0 -29
  52. uncountablepythonsdk-0.0.29/type_spec/external/api/entity/set_values.yaml +0 -18
  53. uncountablepythonsdk-0.0.29/type_spec/external/api/entity/transition_entity_phase.yaml +0 -44
  54. uncountablepythonsdk-0.0.29/type_spec/external/api/entity/unlock_entity.yaml +0 -18
  55. uncountablepythonsdk-0.0.29/type_spec/external/api/field_options/upsert_field_options.yaml +0 -37
  56. uncountablepythonsdk-0.0.29/type_spec/external/api/id_source/list_id_source.yaml +0 -35
  57. uncountablepythonsdk-0.0.29/type_spec/external/api/id_source/match_id_source.yaml +0 -32
  58. uncountablepythonsdk-0.0.29/type_spec/external/api/input_groups/get_input_group_names.yaml +0 -29
  59. uncountablepythonsdk-0.0.29/type_spec/external/api/inputs/create_inputs.yaml +0 -48
  60. uncountablepythonsdk-0.0.29/type_spec/external/api/inputs/get_input_data.yaml +0 -95
  61. uncountablepythonsdk-0.0.29/type_spec/external/api/inputs/get_input_names.yaml +0 -38
  62. uncountablepythonsdk-0.0.29/type_spec/external/api/inputs/get_inputs_data.yaml +0 -82
  63. uncountablepythonsdk-0.0.29/type_spec/external/api/inputs/set_input_attribute_values.yaml +0 -33
  64. uncountablepythonsdk-0.0.29/type_spec/external/api/inputs/set_input_category.yaml +0 -23
  65. uncountablepythonsdk-0.0.29/type_spec/external/api/inputs/set_input_subcategories.yaml +0 -23
  66. uncountablepythonsdk-0.0.29/type_spec/external/api/material_families/update_entity_material_families.yaml +0 -33
  67. uncountablepythonsdk-0.0.29/type_spec/external/api/outputs/get_output_data.yaml +0 -92
  68. uncountablepythonsdk-0.0.29/type_spec/external/api/outputs/get_output_names.yaml +0 -35
  69. uncountablepythonsdk-0.0.29/type_spec/external/api/outputs/resolve_output_conditions.yaml +0 -50
  70. uncountablepythonsdk-0.0.29/type_spec/external/api/permissions/set_core_permissions.yaml +0 -69
  71. uncountablepythonsdk-0.0.29/type_spec/external/api/project/get_projects.yaml +0 -42
  72. uncountablepythonsdk-0.0.29/type_spec/external/api/project/get_projects_data.yaml +0 -50
  73. uncountablepythonsdk-0.0.29/type_spec/external/api/recipe_links/create_recipe_link.yaml +0 -25
  74. uncountablepythonsdk-0.0.29/type_spec/external/api/recipe_metadata/get_recipe_metadata_data.yaml +0 -41
  75. uncountablepythonsdk-0.0.29/type_spec/external/api/recipes/archive_recipes.yaml +0 -20
  76. uncountablepythonsdk-0.0.29/type_spec/external/api/recipes/associate_recipe_as_input.yaml +0 -19
  77. uncountablepythonsdk-0.0.29/type_spec/external/api/recipes/associate_recipe_as_lot.yaml +0 -19
  78. uncountablepythonsdk-0.0.29/type_spec/external/api/recipes/create_recipe.yaml +0 -42
  79. uncountablepythonsdk-0.0.29/type_spec/external/api/recipes/create_recipes.yaml +0 -47
  80. uncountablepythonsdk-0.0.29/type_spec/external/api/recipes/disassociate_recipe_as_input.yaml +0 -16
  81. uncountablepythonsdk-0.0.29/type_spec/external/api/recipes/edit_recipe_inputs.yaml +0 -85
  82. uncountablepythonsdk-0.0.29/type_spec/external/api/recipes/get_curve.yaml +0 -21
  83. uncountablepythonsdk-0.0.29/type_spec/external/api/recipes/get_recipe_calculations.yaml +0 -39
  84. uncountablepythonsdk-0.0.29/type_spec/external/api/recipes/get_recipe_links.yaml +0 -26
  85. uncountablepythonsdk-0.0.29/type_spec/external/api/recipes/get_recipe_names.yaml +0 -29
  86. uncountablepythonsdk-0.0.29/type_spec/external/api/recipes/get_recipe_output_metadata.yaml +0 -36
  87. uncountablepythonsdk-0.0.29/type_spec/external/api/recipes/get_recipes_data.yaml +0 -244
  88. uncountablepythonsdk-0.0.29/type_spec/external/api/recipes/set_recipe_inputs.yaml +0 -42
  89. uncountablepythonsdk-0.0.29/type_spec/external/api/recipes/set_recipe_metadata.yaml +0 -20
  90. uncountablepythonsdk-0.0.29/type_spec/external/api/recipes/set_recipe_outputs.yaml +0 -52
  91. uncountablepythonsdk-0.0.29/type_spec/external/api/recipes/set_recipe_tags.yaml +0 -62
  92. uncountablepythonsdk-0.0.29/type_spec/external/api/recipes/unarchive_recipes.yaml +0 -17
  93. uncountablepythonsdk-0.0.29/type_spec/external/api/triggers/run_trigger.yaml +0 -18
  94. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/README.md +0 -0
  95. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/UncountablePythonSDK.egg-info/dependency_links.txt +0 -0
  96. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/docs/.gitignore +0 -0
  97. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/docs/index.md +0 -0
  98. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/docs/justfile +0 -0
  99. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/docs/quickstart.md +0 -0
  100. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/docs/static/favicons/android-chrome-192x192.png +0 -0
  101. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/docs/static/favicons/android-chrome-512x512.png +0 -0
  102. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/docs/static/favicons/apple-touch-icon.png +0 -0
  103. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/docs/static/favicons/browserconfig.xml +0 -0
  104. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/docs/static/favicons/favicon-16x16.png +0 -0
  105. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/docs/static/favicons/favicon-32x32.png +0 -0
  106. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/docs/static/favicons/manifest.json +0 -0
  107. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/docs/static/favicons/mstile-150x150.png +0 -0
  108. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/docs/static/favicons/safari-pinned-tab.svg +0 -0
  109. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/docs/static/logo_blue.png +0 -0
  110. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/pkgs/__init__.py +0 -0
  111. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/pkgs/argument_parser/__init__.py +0 -0
  112. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/pkgs/argument_parser/_is_enum.py +0 -0
  113. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/pkgs/argument_parser/_is_namedtuple.py +0 -0
  114. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/pkgs/argument_parser/argument_parser.py +0 -0
  115. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/pkgs/serialization/__init__.py +0 -0
  116. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/pkgs/serialization/missing_sentry.py +0 -0
  117. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/pkgs/serialization/opaque_key.py +0 -0
  118. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/pkgs/serialization_util/__init__.py +0 -0
  119. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/pkgs/serialization_util/_get_type_for_serialization.py +0 -0
  120. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/pkgs/serialization_util/serialization_helpers.py +0 -0
  121. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/pkgs/strenum_compat/__init__.py +0 -0
  122. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/pkgs/strenum_compat/strenum_compat.py +0 -0
  123. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/pkgs/type_spec/__init__.py +0 -0
  124. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/pkgs/type_spec/__main__.py +0 -0
  125. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/pkgs/type_spec/actions_registry/__init__.py +0 -0
  126. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/pkgs/type_spec/actions_registry/__main__.py +0 -0
  127. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/pkgs/type_spec/actions_registry/emit_typescript.py +0 -0
  128. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/pkgs/type_spec/builder.py +0 -0
  129. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/pkgs/type_spec/config.py +0 -0
  130. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/pkgs/type_spec/emit_io_ts.py +0 -0
  131. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/pkgs/type_spec/emit_open_api.py +0 -0
  132. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/pkgs/type_spec/emit_open_api_util.py +0 -0
  133. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/pkgs/type_spec/emit_typescript.py +0 -0
  134. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/pkgs/type_spec/emit_typescript_util.py +0 -0
  135. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/pkgs/type_spec/load_types.py +0 -0
  136. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/pkgs/type_spec/open_api_util.py +0 -0
  137. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/pkgs/type_spec/parts/base.py.prepart +0 -0
  138. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/pkgs/type_spec/parts/base.ts.prepart +0 -0
  139. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/pkgs/type_spec/test.py +0 -0
  140. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/pkgs/type_spec/type_info/__main__.py +0 -0
  141. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/pkgs/type_spec/util.py +0 -0
  142. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/pkgs/type_spec/value_spec/__init__.py +0 -0
  143. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/pkgs/type_spec/value_spec/__main__.py +0 -0
  144. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/pkgs/type_spec/value_spec/convert_type.py +0 -0
  145. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/pkgs/type_spec/value_spec/emit_python.py +0 -0
  146. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/pkgs/type_spec/value_spec/types.py +0 -0
  147. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/setup.cfg +0 -0
  148. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/uncountable/core/async_batch.py +1 -1
  149. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/uncountable/integration/__init__.py +0 -0
  150. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/uncountable/integration/db/__init__.py +0 -0
  151. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/uncountable/integration/db/connect.py +1 -1
  152. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/uncountable/integration/executors/__init__.py +0 -0
  153. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/uncountable/integration/server.py +5 -5
  154. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/uncountable/integration/types.py +0 -0
  155. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/uncountable/py.typed +0 -0
  156. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/uncountable/types/api/__init__.py +0 -0
  157. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/uncountable/types/api/batch/__init__.py +0 -0
  158. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/uncountable/types/api/batch/execute_batch.py +0 -0
  159. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/uncountable/types/api/batch/execute_batch_load_async.py +0 -0
  160. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/uncountable/types/api/chemical/__init__.py +0 -0
  161. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/uncountable/types/api/chemical/convert_chemical_formats.py +0 -0
  162. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/uncountable/types/api/entity/__init__.py +0 -0
  163. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/uncountable/types/api/entity/create_entities.py +0 -0
  164. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/uncountable/types/api/entity/create_entity.py +0 -0
  165. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/uncountable/types/api/entity/get_entities_data.py +0 -0
  166. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/uncountable/types/api/entity/lock_entity.py +0 -0
  167. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/uncountable/types/api/entity/resolve_entity_ids.py +0 -0
  168. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/uncountable/types/api/entity/set_values.py +0 -0
  169. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/uncountable/types/api/entity/transition_entity_phase.py +0 -0
  170. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/uncountable/types/api/entity/unlock_entity.py +0 -0
  171. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/uncountable/types/api/field_options/__init__.py +0 -0
  172. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/uncountable/types/api/field_options/upsert_field_options.py +0 -0
  173. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/uncountable/types/api/id_source/__init__.py +0 -0
  174. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/uncountable/types/api/id_source/list_id_source.py +0 -0
  175. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/uncountable/types/api/id_source/match_id_source.py +0 -0
  176. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/uncountable/types/api/input_groups/__init__.py +0 -0
  177. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/uncountable/types/api/input_groups/get_input_group_names.py +0 -0
  178. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/uncountable/types/api/inputs/__init__.py +0 -0
  179. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/uncountable/types/api/inputs/create_inputs.py +0 -0
  180. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/uncountable/types/api/inputs/get_input_data.py +0 -0
  181. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/uncountable/types/api/inputs/get_input_names.py +0 -0
  182. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/uncountable/types/api/inputs/get_inputs_data.py +0 -0
  183. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/uncountable/types/api/inputs/set_input_attribute_values.py +0 -0
  184. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/uncountable/types/api/inputs/set_input_category.py +0 -0
  185. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/uncountable/types/api/inputs/set_input_subcategories.py +0 -0
  186. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/uncountable/types/api/material_families/__init__.py +0 -0
  187. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/uncountable/types/api/material_families/update_entity_material_families.py +0 -0
  188. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/uncountable/types/api/outputs/__init__.py +0 -0
  189. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/uncountable/types/api/outputs/get_output_data.py +0 -0
  190. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/uncountable/types/api/outputs/get_output_names.py +0 -0
  191. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/uncountable/types/api/outputs/resolve_output_conditions.py +0 -0
  192. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/uncountable/types/api/permissions/__init__.py +0 -0
  193. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/uncountable/types/api/permissions/set_core_permissions.py +0 -0
  194. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/uncountable/types/api/project/__init__.py +0 -0
  195. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/uncountable/types/api/project/get_projects.py +0 -0
  196. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/uncountable/types/api/project/get_projects_data.py +0 -0
  197. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/uncountable/types/api/recipe_links/__init__.py +0 -0
  198. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/uncountable/types/api/recipe_links/create_recipe_link.py +0 -0
  199. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/uncountable/types/api/recipe_metadata/__init__.py +0 -0
  200. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/uncountable/types/api/recipe_metadata/get_recipe_metadata_data.py +0 -0
  201. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/uncountable/types/api/recipes/__init__.py +0 -0
  202. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/uncountable/types/api/recipes/archive_recipes.py +0 -0
  203. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/uncountable/types/api/recipes/associate_recipe_as_lot.py +0 -0
  204. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/uncountable/types/api/recipes/create_recipe.py +0 -0
  205. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/uncountable/types/api/recipes/create_recipes.py +0 -0
  206. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/uncountable/types/api/recipes/disassociate_recipe_as_input.py +0 -0
  207. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/uncountable/types/api/recipes/get_curve.py +0 -0
  208. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/uncountable/types/api/recipes/get_recipe_calculations.py +0 -0
  209. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/uncountable/types/api/recipes/get_recipe_links.py +0 -0
  210. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/uncountable/types/api/recipes/get_recipe_names.py +0 -0
  211. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/uncountable/types/api/recipes/get_recipe_output_metadata.py +0 -0
  212. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/uncountable/types/api/recipes/get_recipes_data.py +0 -0
  213. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/uncountable/types/api/recipes/set_recipe_inputs.py +0 -0
  214. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/uncountable/types/api/recipes/set_recipe_metadata.py +0 -0
  215. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/uncountable/types/api/recipes/set_recipe_tags.py +0 -0
  216. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/uncountable/types/api/recipes/unarchive_recipes.py +0 -0
  217. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/uncountable/types/api/triggers/__init__.py +0 -0
  218. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/uncountable/types/api/triggers/run_trigger.py +0 -0
  219. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/uncountable/types/async_batch.py +0 -0
  220. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/uncountable/types/base.py +0 -0
  221. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/uncountable/types/calculations.py +0 -0
  222. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/uncountable/types/chemical_structure.py +0 -0
  223. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/uncountable/types/curves.py +0 -0
  224. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/uncountable/types/entity.py +0 -0
  225. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/uncountable/types/experiment_groups.py +0 -0
  226. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/uncountable/types/field_values.py +0 -0
  227. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/uncountable/types/fields.py +0 -0
  228. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/uncountable/types/id_source.py +0 -0
  229. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/uncountable/types/identifier.py +0 -0
  230. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/uncountable/types/input_attributes.py +0 -0
  231. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/uncountable/types/outputs.py +0 -0
  232. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/uncountable/types/permissions.py +0 -0
  233. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/uncountable/types/phases.py +0 -0
  234. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/uncountable/types/post_base.py +0 -0
  235. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/uncountable/types/recipe_identifiers.py +0 -0
  236. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/uncountable/types/recipe_inputs.py +0 -0
  237. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/uncountable/types/recipe_links.py +0 -0
  238. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/uncountable/types/recipe_metadata.py +0 -0
  239. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/uncountable/types/recipe_output_metadata.py +0 -0
  240. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/uncountable/types/recipe_tags.py +0 -0
  241. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/uncountable/types/recipe_workflow_steps.py +0 -0
  242. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/uncountable/types/response.py +0 -0
  243. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/uncountable/types/units.py +0 -0
  244. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/uncountable/types/users.py +0 -0
  245. {uncountablepythonsdk-0.0.29 → uncountablepythonsdk-0.0.31}/uncountable/types/workflows.py +0 -0
@@ -9,9 +9,9 @@ jobs:
9
9
  docs:
10
10
  runs-on: ubuntu-latest
11
11
  steps:
12
- - uses: actions/checkout@v3
13
- - uses: actions/setup-python@v3
14
- - uses: extractions/setup-just@v1
12
+ - uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744 # v3
13
+ - uses: actions/setup-python@82c7e631bb3cdc910f68e0081d67478d79c6982d # v5
14
+ - uses: extractions/setup-just@dd310ad5a97d8e7b41793f8ef055398d51ad4de6 # v2
15
15
  with:
16
16
  just-version: '1.8.0'
17
17
  github-token: ${{ secrets.GITHUB_TOKEN }}
@@ -25,7 +25,7 @@ jobs:
25
25
  run: |
26
26
  just -f docs/justfile docs-build
27
27
  - name: Deploy to GitHub Pages
28
- uses: peaceiris/actions-gh-pages@v3
28
+ uses: peaceiris/actions-gh-pages@4f9cc6602d3f66b9c108549d475ec49e8ef4d45e # v4
29
29
  if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/main' }}
30
30
  with:
31
31
  publish_branch: gh-pages
@@ -19,10 +19,10 @@ jobs:
19
19
  name: Build distribution packages
20
20
  runs-on: ubuntu-latest
21
21
  steps:
22
- - uses: actions/checkout@v4
22
+ - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4
23
23
  with:
24
24
  fetch-depth: 0
25
- - uses: actions/setup-python@v5
25
+ - uses: actions/setup-python@82c7e631bb3cdc910f68e0081d67478d79c6982d # v5
26
26
  with:
27
27
  python-version: '3.11'
28
28
  - name: Install build dependencies
@@ -31,7 +31,7 @@ jobs:
31
31
  - name: Build distributions and wheels
32
32
  run: |
33
33
  python3 -m build
34
- - uses: actions/upload-artifact@v4
34
+ - uses: actions/upload-artifact@65462800fd760344b1a7b4382951275a0abb4808 # v4
35
35
  with:
36
36
  name: package-distributions
37
37
  path: dist/
@@ -45,9 +45,9 @@ jobs:
45
45
  permissions:
46
46
  id-token: write
47
47
  steps:
48
- - uses: actions/download-artifact@v4
48
+ - uses: actions/download-artifact@65a9edc5881444af0b9093a5e628f2fe47ea3b2e # v4
49
49
  with:
50
50
  name: package-distributions
51
51
  path: dist/
52
52
  - name: Publish package distributions to PyPI
53
- uses: pypa/gh-action-pypi-publish@e53eb8b103ffcb59469888563dc324e3c8ba6f06
53
+ uses: pypa/gh-action-pypi-publish@ec4db0b4ddc65acdf4bff5fa45ac92d78b56bdf0
@@ -22,3 +22,8 @@ tox.ini
22
22
  .ipynb_checkpoints
23
23
  *.ipynb
24
24
 
25
+ # OVERRIDES FROM MAIN
26
+ !*.txt
27
+ !*.gif
28
+ !*.jpg
29
+ !*.png
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: UncountablePythonSDK
3
- Version: 0.0.29
3
+ Version: 0.0.31
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
@@ -27,9 +27,9 @@ Requires-Dist: PyYAML==6.*
27
27
  Provides-Extra: test
28
28
  Requires-Dist: mypy==1.*; extra == "test"
29
29
  Requires-Dist: ruff==0.*; extra == "test"
30
- Requires-Dist: pytest==7.*; extra == "test"
31
- Requires-Dist: coverage[toml]==6.*; extra == "test"
32
- Requires-Dist: pytest-cov==4.*; extra == "test"
30
+ Requires-Dist: pytest==8.*; extra == "test"
31
+ Requires-Dist: coverage[toml]==7.*; extra == "test"
32
+ Requires-Dist: pytest-cov==5.*; extra == "test"
33
33
  Requires-Dist: pytest-xdist==3.*; extra == "test"
34
34
 
35
35
  # Uncountable Python SDK
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: UncountablePythonSDK
3
- Version: 0.0.29
3
+ Version: 0.0.31
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
@@ -27,9 +27,9 @@ Requires-Dist: PyYAML==6.*
27
27
  Provides-Extra: test
28
28
  Requires-Dist: mypy==1.*; extra == "test"
29
29
  Requires-Dist: ruff==0.*; extra == "test"
30
- Requires-Dist: pytest==7.*; extra == "test"
31
- Requires-Dist: coverage[toml]==6.*; extra == "test"
32
- Requires-Dist: pytest-cov==4.*; extra == "test"
30
+ Requires-Dist: pytest==8.*; extra == "test"
31
+ Requires-Dist: coverage[toml]==7.*; extra == "test"
32
+ Requires-Dist: pytest-cov==5.*; extra == "test"
33
33
  Requires-Dist: pytest-xdist==3.*; extra == "test"
34
34
 
35
35
  # Uncountable Python SDK
@@ -27,7 +27,6 @@ docs/static/favicons/safari-pinned-tab.svg
27
27
  examples/async_batch.py
28
28
  examples/create_entity.py
29
29
  examples/upload_files.py
30
- examples/recipe-import/importer.py
31
30
  pkgs/__init__.py
32
31
  pkgs/argument_parser/__init__.py
33
32
  pkgs/argument_parser/_is_enum.py
@@ -69,57 +68,6 @@ pkgs/type_spec/value_spec/__main__.py
69
68
  pkgs/type_spec/value_spec/convert_type.py
70
69
  pkgs/type_spec/value_spec/emit_python.py
71
70
  pkgs/type_spec/value_spec/types.py
72
- type_spec/external/api/batch/execute_batch.yaml
73
- type_spec/external/api/batch/execute_batch_load_async.yaml
74
- type_spec/external/api/chemical/convert_chemical_formats.yaml
75
- type_spec/external/api/entity/create_entities.yaml
76
- type_spec/external/api/entity/create_entity.yaml
77
- type_spec/external/api/entity/get_entities_data.yaml
78
- type_spec/external/api/entity/list_entities.yaml
79
- type_spec/external/api/entity/lock_entity.yaml
80
- type_spec/external/api/entity/resolve_entity_ids.yaml
81
- type_spec/external/api/entity/set_values.yaml
82
- type_spec/external/api/entity/transition_entity_phase.yaml
83
- type_spec/external/api/entity/unlock_entity.yaml
84
- type_spec/external/api/field_options/upsert_field_options.yaml
85
- type_spec/external/api/id_source/list_id_source.yaml
86
- type_spec/external/api/id_source/match_id_source.yaml
87
- type_spec/external/api/input_groups/get_input_group_names.yaml
88
- type_spec/external/api/inputs/create_inputs.yaml
89
- type_spec/external/api/inputs/get_input_data.yaml
90
- type_spec/external/api/inputs/get_input_names.yaml
91
- type_spec/external/api/inputs/get_inputs_data.yaml
92
- type_spec/external/api/inputs/set_input_attribute_values.yaml
93
- type_spec/external/api/inputs/set_input_category.yaml
94
- type_spec/external/api/inputs/set_input_subcategories.yaml
95
- type_spec/external/api/material_families/update_entity_material_families.yaml
96
- type_spec/external/api/outputs/get_output_data.yaml
97
- type_spec/external/api/outputs/get_output_names.yaml
98
- type_spec/external/api/outputs/resolve_output_conditions.yaml
99
- type_spec/external/api/permissions/set_core_permissions.yaml
100
- type_spec/external/api/project/get_projects.yaml
101
- type_spec/external/api/project/get_projects_data.yaml
102
- type_spec/external/api/recipe_links/create_recipe_link.yaml
103
- type_spec/external/api/recipe_metadata/get_recipe_metadata_data.yaml
104
- type_spec/external/api/recipes/archive_recipes.yaml
105
- type_spec/external/api/recipes/associate_recipe_as_input.yaml
106
- type_spec/external/api/recipes/associate_recipe_as_lot.yaml
107
- type_spec/external/api/recipes/create_recipe.yaml
108
- type_spec/external/api/recipes/create_recipes.yaml
109
- type_spec/external/api/recipes/disassociate_recipe_as_input.yaml
110
- type_spec/external/api/recipes/edit_recipe_inputs.yaml
111
- type_spec/external/api/recipes/get_curve.yaml
112
- type_spec/external/api/recipes/get_recipe_calculations.yaml
113
- type_spec/external/api/recipes/get_recipe_links.yaml
114
- type_spec/external/api/recipes/get_recipe_names.yaml
115
- type_spec/external/api/recipes/get_recipe_output_metadata.yaml
116
- type_spec/external/api/recipes/get_recipes_data.yaml
117
- type_spec/external/api/recipes/set_recipe_inputs.yaml
118
- type_spec/external/api/recipes/set_recipe_metadata.yaml
119
- type_spec/external/api/recipes/set_recipe_outputs.yaml
120
- type_spec/external/api/recipes/set_recipe_tags.yaml
121
- type_spec/external/api/recipes/unarchive_recipes.yaml
122
- type_spec/external/api/triggers/run_trigger.yaml
123
71
  uncountable/__init__.py
124
72
  uncountable/py.typed
125
73
  uncountable/core/__init__.py
@@ -165,6 +113,7 @@ uncountable/types/recipe_metadata.py
165
113
  uncountable/types/recipe_output_metadata.py
166
114
  uncountable/types/recipe_tags.py
167
115
  uncountable/types/recipe_workflow_steps.py
116
+ uncountable/types/recipes.py
168
117
  uncountable/types/response.py
169
118
  uncountable/types/units.py
170
119
  uncountable/types/users.py
@@ -200,6 +149,7 @@ uncountable/types/api/inputs/get_inputs_data.py
200
149
  uncountable/types/api/inputs/set_input_attribute_values.py
201
150
  uncountable/types/api/inputs/set_input_category.py
202
151
  uncountable/types/api/inputs/set_input_subcategories.py
152
+ uncountable/types/api/inputs/set_intermediate_type.py
203
153
  uncountable/types/api/material_families/__init__.py
204
154
  uncountable/types/api/material_families/update_entity_material_families.py
205
155
  uncountable/types/api/outputs/__init__.py
@@ -216,6 +166,7 @@ uncountable/types/api/recipe_links/create_recipe_link.py
216
166
  uncountable/types/api/recipe_metadata/__init__.py
217
167
  uncountable/types/api/recipe_metadata/get_recipe_metadata_data.py
218
168
  uncountable/types/api/recipes/__init__.py
169
+ uncountable/types/api/recipes/add_recipe_to_project.py
219
170
  uncountable/types/api/recipes/archive_recipes.py
220
171
  uncountable/types/api/recipes/associate_recipe_as_input.py
221
172
  uncountable/types/api/recipes/associate_recipe_as_lot.py
@@ -229,6 +180,7 @@ uncountable/types/api/recipes/get_recipe_links.py
229
180
  uncountable/types/api/recipes/get_recipe_names.py
230
181
  uncountable/types/api/recipes/get_recipe_output_metadata.py
231
182
  uncountable/types/api/recipes/get_recipes_data.py
183
+ uncountable/types/api/recipes/remove_recipe_from_project.py
232
184
  uncountable/types/api/recipes/set_recipe_inputs.py
233
185
  uncountable/types/api/recipes/set_recipe_metadata.py
234
186
  uncountable/types/api/recipes/set_recipe_outputs.py
@@ -10,7 +10,7 @@ PyYAML==6.*
10
10
  [test]
11
11
  mypy==1.*
12
12
  ruff==0.*
13
- pytest==7.*
14
- coverage[toml]==6.*
15
- pytest-cov==4.*
13
+ pytest==8.*
14
+ coverage[toml]==7.*
15
+ pytest-cov==5.*
16
16
  pytest-xdist==3.*
@@ -2,5 +2,4 @@ dist
2
2
  docs
3
3
  examples
4
4
  pkgs
5
- type_spec
6
5
  uncountable
@@ -7,7 +7,6 @@
7
7
  # https://www.sphinx-doc.org/en/master/usage/configuration.html#project-information
8
8
 
9
9
  from datetime import date
10
- import uncountable
11
10
 
12
11
  project = "Uncountable SDK"
13
12
  copyright = f"{date.today().year}, Uncountable Inc"
@@ -26,9 +25,15 @@ extensions = [
26
25
  myst_enable_extensions = ["fieldlist", "deflist"]
27
26
 
28
27
  autoapi_dirs = ["../uncountable"]
29
- autoapi_options = [ 'members', 'undoc-members', 'show-inheritance', 'show-module-summary', 'imported-members' ]
30
- autoapi_ignore = ['*integration*']
31
- autodoc_typehints = 'description'
28
+ autoapi_options = [
29
+ "members",
30
+ "undoc-members",
31
+ "show-inheritance",
32
+ "show-module-summary",
33
+ "imported-members",
34
+ ]
35
+ autoapi_ignore = ["*integration*"]
36
+ autodoc_typehints = "description"
32
37
 
33
38
  exclude_patterns = ["_build", "Thumbs.db", ".DS_Store"]
34
39
 
@@ -0,0 +1,7 @@
1
+ furo==2024.5.6
2
+ myst-parser==3.0.1
3
+ sphinx-autoapi==3.1.0
4
+ sphinx-copybutton==0.5.2
5
+ Sphinx==7.3.7
6
+ sphinx_design==0.6.0
7
+ sphinx-favicon==1.0.1
@@ -1,6 +1,6 @@
1
1
  from decimal import Decimal
2
- from uncountable.core import AuthDetailsApiKey, Client
3
- from uncountable.core import AsyncBatchProcessor
2
+
3
+ from uncountable.core import AsyncBatchProcessor, AuthDetailsApiKey, Client
4
4
  from uncountable.types import (
5
5
  recipe_metadata,
6
6
  )
@@ -10,7 +10,6 @@ from uncountable.types.recipe_identifiers import (
10
10
  RecipeIdentifiers,
11
11
  )
12
12
 
13
-
14
13
  client = Client(
15
14
  base_url="https://app.uncountable.com",
16
15
  auth_details=AuthDetailsApiKey(
@@ -1,23 +1,20 @@
1
1
  from uncountable.core import AuthDetailsOAuth, Client
2
+ from uncountable.core.client import ClientConfig
2
3
  from uncountable.types import (
3
4
  entity_t,
4
5
  field_values_t,
5
6
  )
6
7
 
7
-
8
8
  client = Client(
9
9
  base_url="https://app.uncountable.com",
10
- auth_details=AuthDetailsOAuth(
11
- refresh_token="x"
12
- ),
10
+ auth_details=AuthDetailsOAuth(refresh_token="x"),
11
+ config=ClientConfig(allow_insecure_tls=False),
13
12
  )
14
13
  entities = client.create_entity(
15
14
  definition_id=24,
16
15
  entity_type=entity_t.EntityType.LAB_REQUEST,
17
16
  field_values=[
18
- field_values_t.FieldRefNameValue(
19
- field_ref_name="name", value="SDK Lab Request"
20
- ),
17
+ field_values_t.FieldRefNameValue(field_ref_name="name", value="SDK Lab Request"),
21
18
  field_values_t.FieldRefNameValue(field_ref_name="materialFamilyId", value=1),
22
19
  ],
23
20
  )
@@ -1,7 +1,7 @@
1
1
  import os
2
2
  from pprint import pprint
3
3
 
4
- from uncountable import AuthDetailsApiKey, Client, MediaFileUpload
4
+ from uncountable.core import AuthDetailsApiKey, Client, MediaFileUpload
5
5
 
6
6
  client = Client(
7
7
  base_url="http://localhost:5000",
@@ -4,9 +4,10 @@ import re
4
4
 
5
5
  @functools.lru_cache(maxsize=500000)
6
6
  def snake_to_camel_case(o: str) -> str:
7
- return "".join([
8
- part.title() if i > 0 else part for i, part in enumerate(o.split("_"))
9
- ])
7
+ tokens = o.split("_")
8
+ if len(tokens) < 2:
9
+ return o
10
+ return "".join([part.title() if i > 0 else part for i, part in enumerate(tokens)])
10
11
 
11
12
 
12
13
  def kebab_to_pascal_case(o: str) -> str:
@@ -16,6 +16,9 @@ class _SerialClassData:
16
16
  parse_require: set[str] = dataclasses.field(default_factory=set)
17
17
 
18
18
 
19
+ EMPTY_SERIAL_CLASS_DATA = _SerialClassData()
20
+
21
+
19
22
  def serial_class(
20
23
  *,
21
24
  unconverted_keys: Optional[set[str]] = None,
@@ -57,58 +60,49 @@ def serial_class(
57
60
 
58
61
 
59
62
  class SerialClassDataInspector:
60
- bases: list[SerialClassDataInspector]
61
-
62
63
  def __init__(
63
- self, bases: list[SerialClassDataInspector], current: _SerialClassData
64
+ self,
65
+ current: _SerialClassData,
64
66
  ) -> None:
65
- self.bases = bases
66
67
  self.current = current
67
68
 
68
69
  def has_unconverted_key(self, key: str) -> bool:
69
- if key in self.current.unconverted_keys:
70
- return True
71
- for base in self.bases:
72
- if base.has_unconverted_key(key):
73
- return True
74
- return False
70
+ return key in self.current.unconverted_keys
75
71
 
76
72
  def has_unconverted_value(self, key: str) -> bool:
77
- if key in self.current.unconverted_values:
78
- return True
79
- for base in self.bases:
80
- if base.has_unconverted_value(key):
81
- return True
82
- return False
73
+ return key in self.current.unconverted_values
83
74
 
84
75
  def has_to_string_value(self, key: str) -> bool:
85
- if key in self.current.to_string_values:
86
- return True
87
- for base in self.bases:
88
- if base.has_to_string_value(key):
89
- return True
90
- return False
76
+ return key in self.current.to_string_values
91
77
 
92
78
  def has_parse_require(self, key: str) -> bool:
93
- if key in self.current.parse_require:
94
- return True
95
- for base in self.bases:
96
- if base.has_parse_require(key):
97
- return True
98
- return False
79
+ return key in self.current.parse_require
99
80
 
100
81
 
101
- def get_serial_class_data(type_class: type[Any]) -> SerialClassDataInspector:
102
- bases = (
103
- [get_serial_class_data(base) for base in type_class.__bases__]
104
- if type_class.__bases__ is not None
105
- else []
106
- )
107
- return SerialClassDataInspector(
108
- bases,
82
+ def _get_merged_serial_class_data(type_class: type[Any]) -> _SerialClassData | None:
83
+ base_class_data = (
109
84
  cast(_SerialClassData, type_class.__unc_serial_data)
110
85
  if hasattr(type_class, "__unc_serial_data")
111
- else _SerialClassData(),
86
+ else None
87
+ )
88
+ if type_class.__bases__ is not None:
89
+ for base in type_class.__bases__:
90
+ curr_base_class_data = _get_merged_serial_class_data(base)
91
+ if curr_base_class_data is not None:
92
+ if base_class_data is None:
93
+ base_class_data = _SerialClassData()
94
+ base_class_data.unconverted_keys |= curr_base_class_data.unconverted_keys
95
+ base_class_data.unconverted_values |= (
96
+ curr_base_class_data.unconverted_values
97
+ )
98
+ base_class_data.to_string_values |= curr_base_class_data.to_string_values
99
+ base_class_data.parse_require |= curr_base_class_data.parse_require
100
+ return base_class_data
101
+
102
+
103
+ def get_serial_class_data(type_class: type[Any]) -> SerialClassDataInspector:
104
+ return SerialClassDataInspector(
105
+ _get_merged_serial_class_data(type_class) or EMPTY_SERIAL_CLASS_DATA
112
106
  )
113
107
 
114
108
 
@@ -1194,7 +1194,6 @@ ASYNC_BATCH_PROCESSOR_FILENAME = "async_batch_processor"
1194
1194
  ASYNC_BATCH_PROCESSOR_IMPORTS = [
1195
1195
  "import uuid",
1196
1196
  "from abc import ABC, abstractmethod",
1197
- "from dataclasses import dataclass",
1198
1197
  "from pkgs.serialization_util.serialization_helpers import serialize_for_api",
1199
1198
  ]
1200
1199
 
@@ -247,17 +247,25 @@ def _extract_and_validate_layout(
247
247
  return layout
248
248
 
249
249
 
250
- def _validate_type_ext_info(stype: builder.SpecTypeDefnObject) -> ExtInfoLayout | None:
250
+ def _validate_type_ext_info(
251
+ stype: builder.SpecTypeDefnObject,
252
+ ) -> tuple[ExtInfoLayout | None, Optional[data_t.ExtInfo]]:
251
253
  ext_info = _parse_ext_info(stype.ext_info)
252
254
  if ext_info is None:
253
- return None
255
+ return None, None
256
+
257
+ if ext_info.label_fields is not None:
258
+ assert stype.properties is not None
259
+ for name in ext_info.label_fields:
260
+ prop = stype.properties.get(name)
261
+ assert prop is not None, f"missing-label-field:{name}"
254
262
 
255
263
  if not stype.is_base and isinstance(stype.base, builder.SpecTypeDefnObject):
256
- base_layout = _validate_type_ext_info(stype.base)
264
+ base_layout, _ = _validate_type_ext_info(stype.base)
257
265
  else:
258
266
  base_layout = None
259
267
 
260
- return _extract_and_validate_layout(stype, ext_info, base_layout)
268
+ return _extract_and_validate_layout(stype, ext_info, base_layout), ext_info
261
269
 
262
270
 
263
271
  def _build_map_type(
@@ -270,7 +278,7 @@ def _build_map_type(
270
278
  and not stype.is_base
271
279
  and stype.base is not None
272
280
  ):
273
- _validate_type_ext_info(stype)
281
+ _, ext_info = _validate_type_ext_info(stype)
274
282
 
275
283
  properties: dict[str, MapProperty] = {}
276
284
  map_type = MapTypeObject(
@@ -279,7 +287,7 @@ def _build_map_type(
279
287
  properties=properties,
280
288
  desc=stype.desc,
281
289
  base_type_path=type_path_of(stype.base),
282
- ext_info=_convert_ext_info(stype.ext_info),
290
+ ext_info=serialize_for_api(ext_info),
283
291
  )
284
292
 
285
293
  if stype.properties is not None:
@@ -67,9 +67,9 @@ test = [
67
67
  "mypy == 1.*",
68
68
  "ruff == 0.*",
69
69
  # Testing
70
- "pytest == 7.*",
71
- "coverage[toml] == 6.*",
72
- "pytest-cov == 4.*",
70
+ "pytest ==8.*",
71
+ "coverage[toml] ==7.*",
72
+ "pytest-cov ==5.*",
73
73
  "pytest-xdist == 3.*",
74
74
  ]
75
75
 
@@ -1,5 +1,4 @@
1
- from . import types
2
- from . import core
1
+ from . import core, types
3
2
 
4
3
  __all__ = []
5
4
  __all__ += types.__all__
@@ -1,6 +1,13 @@
1
+ from .async_batch import AsyncBatchProcessor
1
2
  from .client import Client
2
- from .types import AuthDetailsApiKey, AuthDetailsOAuth
3
3
  from .file_upload import MediaFileUpload, UploadedFile
4
- from .async_batch import AsyncBatchProcessor
4
+ from .types import AuthDetailsApiKey, AuthDetailsOAuth
5
5
 
6
- __all__: list[str] = ["AuthDetailsApiKey", "AuthDetailsOAuth", "AsyncBatchProcessor", "Client", "MediaFileUpload", "UploadedFile"]
6
+ __all__: list[str] = [
7
+ "AuthDetailsApiKey",
8
+ "AuthDetailsOAuth",
9
+ "AsyncBatchProcessor",
10
+ "Client",
11
+ "MediaFileUpload",
12
+ "UploadedFile",
13
+ ]
@@ -1,10 +1,11 @@
1
1
  import base64
2
- from datetime import datetime, timedelta
3
2
  import json
4
3
  import typing
5
4
  from dataclasses import dataclass
5
+ from datetime import datetime, timedelta
6
6
  from enum import StrEnum
7
7
  from urllib.parse import urljoin
8
+ from uuid import uuid4
8
9
 
9
10
  import requests
10
11
  from requests.exceptions import JSONDecodeError
@@ -18,6 +19,7 @@ from .file_upload import FileUpload, FileUploader, UploadedFile
18
19
  from .types import AuthDetailsAll, AuthDetailsApiKey, AuthDetailsOAuth
19
20
 
20
21
  DT = typing.TypeVar("DT")
22
+ UNC_REQUEST_ID_HEADER = "X-UNC-REQUEST-ID"
21
23
 
22
24
 
23
25
  class EndpointMethod(StrEnum):
@@ -30,19 +32,17 @@ class HTTPRequestBase:
30
32
  method: EndpointMethod
31
33
  url: str
32
34
  headers: dict[str, str]
33
- body: typing.Optional[typing.Union[str, dict[str, str]]] = None
34
- query_params: typing.Optional[dict[str, str]] = None
35
35
 
36
36
 
37
37
  @dataclass(kw_only=True)
38
38
  class HTTPGetRequest(HTTPRequestBase):
39
- method: typing.Literal[EndpointMethod.GET]
39
+ method = EndpointMethod.GET
40
40
  query_params: dict[str, str]
41
41
 
42
42
 
43
43
  @dataclass(kw_only=True)
44
44
  class HTTPPostRequest(HTTPRequestBase):
45
- method: typing.Literal[EndpointMethod.POST]
45
+ method = EndpointMethod.POST
46
46
  body: typing.Union[str, dict[str, str]]
47
47
 
48
48
 
@@ -101,13 +101,15 @@ class APIResponseError(BaseException):
101
101
 
102
102
  class SDKError(BaseException):
103
103
  message: str
104
+ request_id: str
104
105
 
105
- def __init__(self, message: str) -> None:
106
+ def __init__(self, message: str, *, request_id: str) -> None:
106
107
  super().__init__(message)
107
108
  self.message = message
109
+ self.request_id = request_id
108
110
 
109
111
  def __str__(self) -> str:
110
- return f"internal SDK error, please contact Uncountable support: {self.message}"
112
+ return f"internal SDK error (request id {self.request_id}), please contact Uncountable support: {self.message}"
111
113
 
112
114
 
113
115
  @dataclass(kw_only=True)
@@ -147,7 +149,9 @@ class Client(ClientMethods):
147
149
  self._file_uploader = FileUploader(self._base_url, self._auth_details)
148
150
  self._cfg = config or ClientConfig()
149
151
 
150
- def _get_response_json(self, response: requests.Response) -> dict[str, JsonValue]:
152
+ def _get_response_json(
153
+ self, response: requests.Response, request_id: str
154
+ ) -> dict[str, JsonValue]:
151
155
  if response.status_code < 200 or response.status_code > 299:
152
156
  extra_details: dict[str, JsonValue] | None = None
153
157
  try:
@@ -160,12 +164,15 @@ class Client(ClientMethods):
160
164
  status_code=response.status_code, extra_details=extra_details
161
165
  )
162
166
  try:
163
- return response.json()
164
- except JSONDecodeError:
165
- raise SDKError("unable to process response")
167
+ return typing.cast(dict[str, JsonValue], response.json())
168
+ except JSONDecodeError as e:
169
+ raise SDKError("unable to process response", request_id=request_id) from e
166
170
 
167
171
  def do_request(self, *, api_request: APIRequest, return_type: type[DT]) -> DT:
168
- http_request = self._build_http_request(api_request=api_request)
172
+ request_id = str(uuid4())
173
+ http_request = self._build_http_request(
174
+ api_request=api_request, request_id=request_id
175
+ )
169
176
  match http_request:
170
177
  case HTTPGetRequest():
171
178
  response = requests.get(
@@ -179,18 +186,17 @@ class Client(ClientMethods):
179
186
  http_request.url,
180
187
  headers=http_request.headers,
181
188
  data=http_request.body,
182
- params=http_request.query_params,
183
189
  verify=not self._cfg.allow_insecure_tls,
184
190
  )
185
191
  case _:
186
192
  typing.assert_never(http_request)
187
- response_data = self._get_response_json(response)
193
+ response_data = self._get_response_json(response, request_id=request_id)
188
194
  cached_parser = self._get_cached_parser(return_type)
189
195
  try:
190
196
  data = response_data["data"]
191
197
  return cached_parser.parse_api(data)
192
198
  except (ValueError, JSONDecodeError, KeyError) as e:
193
- raise SDKError("unable to process response") from e
199
+ raise SDKError("unable to process response", request_id=request_id) from e
194
200
 
195
201
  def _get_cached_parser(self, data_type: type[DT]) -> CachedParser[DT]:
196
202
  if data_type not in self._parser_map:
@@ -213,8 +219,9 @@ class Client(ClientMethods):
213
219
  "scope": oauth_details.scope,
214
220
  "grant_type": "client_credentials",
215
221
  },
222
+ verify=not self._cfg.allow_insecure_tls,
216
223
  )
217
- data = self._get_response_json(response)
224
+ data = self._get_response_json(response, request_id=str(uuid4()))
218
225
  token_data = oauth_bearer_token_data_parser.parse_storage(data)
219
226
  self._oauth_bearer_token_cache = OAuthBearerTokenCache(
220
227
  token=token_data.access_token,
@@ -235,8 +242,11 @@ class Client(ClientMethods):
235
242
  return {"Authorization": f"Bearer {token}"}
236
243
  typing.assert_never(self._auth_details)
237
244
 
238
- def _build_http_request(self, *, api_request: APIRequest) -> HTTPRequest:
245
+ def _build_http_request(
246
+ self, *, api_request: APIRequest, request_id: str
247
+ ) -> HTTPRequest:
239
248
  headers = self._build_auth_headers()
249
+ headers[UNC_REQUEST_ID_HEADER] = request_id
240
250
  method = api_request.method.lower()
241
251
  data = {"data": json.dumps(serialize_for_api(api_request.args))}
242
252
  match method: