UncountablePythonSDK 0.0.23__tar.gz → 0.0.25__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 (226) hide show
  1. {uncountablepythonsdk-0.0.23/UncountablePythonSDK.egg-info → uncountablepythonsdk-0.0.25}/PKG-INFO +1 -1
  2. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25/UncountablePythonSDK.egg-info}/PKG-INFO +1 -1
  3. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/UncountablePythonSDK.egg-info/SOURCES.txt +2 -0
  4. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/examples/create_entity.py +4 -4
  5. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/pkgs/type_spec/open_api_util.py +13 -4
  6. uncountablepythonsdk-0.0.25/type_spec/external/api/recipes/archive_recipes.yaml +20 -0
  7. uncountablepythonsdk-0.0.25/uncountable/core/__init__.py +6 -0
  8. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/core/client.py +83 -20
  9. uncountablepythonsdk-0.0.25/uncountable/core/types.py +16 -0
  10. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/types/__init__.py +2 -0
  11. uncountablepythonsdk-0.0.25/uncountable/types/api/recipes/archive_recipes.py +35 -0
  12. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/types/async_batch.py +1 -0
  13. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/types/client_base.py +23 -0
  14. uncountablepythonsdk-0.0.23/uncountable/core/__init__.py +0 -5
  15. uncountablepythonsdk-0.0.23/uncountable/core/types.py +0 -22
  16. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/.github/workflows/documentation.yml +0 -0
  17. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/.github/workflows/publish.yml +0 -0
  18. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/.gitignore +0 -0
  19. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/README.md +0 -0
  20. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/UncountablePythonSDK.egg-info/dependency_links.txt +0 -0
  21. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/UncountablePythonSDK.egg-info/requires.txt +0 -0
  22. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/UncountablePythonSDK.egg-info/top_level.txt +0 -0
  23. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/docs/.gitignore +0 -0
  24. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/docs/conf.py +0 -0
  25. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/docs/index.md +0 -0
  26. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/docs/justfile +0 -0
  27. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/docs/quickstart.md +0 -0
  28. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/docs/requirements.txt +0 -0
  29. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/docs/static/favicons/android-chrome-192x192.png +0 -0
  30. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/docs/static/favicons/android-chrome-512x512.png +0 -0
  31. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/docs/static/favicons/apple-touch-icon.png +0 -0
  32. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/docs/static/favicons/browserconfig.xml +0 -0
  33. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/docs/static/favicons/favicon-16x16.png +0 -0
  34. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/docs/static/favicons/favicon-32x32.png +0 -0
  35. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/docs/static/favicons/manifest.json +0 -0
  36. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/docs/static/favicons/mstile-150x150.png +0 -0
  37. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/docs/static/favicons/safari-pinned-tab.svg +0 -0
  38. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/docs/static/logo_blue.png +0 -0
  39. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/examples/async_batch.py +0 -0
  40. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/examples/recipe-import/importer.py +0 -0
  41. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/examples/upload_files.py +0 -0
  42. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/pkgs/__init__.py +0 -0
  43. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/pkgs/argument_parser/__init__.py +0 -0
  44. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/pkgs/argument_parser/_is_enum.py +0 -0
  45. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/pkgs/argument_parser/_is_namedtuple.py +0 -0
  46. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/pkgs/argument_parser/argument_parser.py +0 -0
  47. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/pkgs/argument_parser/case_convert.py +0 -0
  48. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/pkgs/serialization/__init__.py +0 -0
  49. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/pkgs/serialization/missing_sentry.py +0 -0
  50. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/pkgs/serialization/opaque_key.py +0 -0
  51. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/pkgs/serialization/serial_class.py +0 -0
  52. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/pkgs/serialization_util/__init__.py +0 -0
  53. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/pkgs/serialization_util/_get_type_for_serialization.py +0 -0
  54. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/pkgs/serialization_util/serialization_helpers.py +0 -0
  55. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/pkgs/strenum_compat/__init__.py +0 -0
  56. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/pkgs/strenum_compat/strenum_compat.py +0 -0
  57. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/pkgs/type_spec/__init__.py +0 -0
  58. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/pkgs/type_spec/__main__.py +0 -0
  59. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/pkgs/type_spec/actions_registry/__init__.py +0 -0
  60. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/pkgs/type_spec/actions_registry/__main__.py +0 -0
  61. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/pkgs/type_spec/actions_registry/emit_typescript.py +0 -0
  62. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/pkgs/type_spec/builder.py +0 -0
  63. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/pkgs/type_spec/config.py +0 -0
  64. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/pkgs/type_spec/emit_io_ts.py +0 -0
  65. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/pkgs/type_spec/emit_open_api.py +0 -0
  66. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/pkgs/type_spec/emit_open_api_util.py +0 -0
  67. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/pkgs/type_spec/emit_python.py +0 -0
  68. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/pkgs/type_spec/emit_typescript.py +0 -0
  69. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/pkgs/type_spec/emit_typescript_util.py +0 -0
  70. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/pkgs/type_spec/load_types.py +0 -0
  71. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/pkgs/type_spec/parts/base.py.prepart +0 -0
  72. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/pkgs/type_spec/parts/base.ts.prepart +0 -0
  73. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/pkgs/type_spec/test.py +0 -0
  74. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/pkgs/type_spec/type_info/__main__.py +0 -0
  75. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/pkgs/type_spec/type_info/emit_type_info.py +0 -0
  76. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/pkgs/type_spec/util.py +0 -0
  77. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/pkgs/type_spec/value_spec/__init__.py +0 -0
  78. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/pkgs/type_spec/value_spec/__main__.py +0 -0
  79. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/pkgs/type_spec/value_spec/convert_type.py +0 -0
  80. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/pkgs/type_spec/value_spec/emit_python.py +0 -0
  81. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/pkgs/type_spec/value_spec/types.py +0 -0
  82. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/pyproject.toml +0 -0
  83. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/setup.cfg +0 -0
  84. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/type_spec/external/api/batch/execute_batch.yaml +0 -0
  85. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/type_spec/external/api/batch/execute_batch_load_async.yaml +0 -0
  86. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/type_spec/external/api/chemical/convert_chemical_formats.yaml +0 -0
  87. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/type_spec/external/api/entity/create_entities.yaml +0 -0
  88. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/type_spec/external/api/entity/create_entity.yaml +0 -0
  89. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/type_spec/external/api/entity/get_entities_data.yaml +0 -0
  90. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/type_spec/external/api/entity/list_entities.yaml +0 -0
  91. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/type_spec/external/api/entity/resolve_entity_ids.yaml +0 -0
  92. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/type_spec/external/api/entity/set_values.yaml +0 -0
  93. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/type_spec/external/api/entity/transition_entity_phase.yaml +0 -0
  94. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/type_spec/external/api/id_source/list_id_source.yaml +0 -0
  95. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/type_spec/external/api/id_source/match_id_source.yaml +0 -0
  96. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/type_spec/external/api/input_groups/get_input_group_names.yaml +0 -0
  97. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/type_spec/external/api/inputs/create_inputs.yaml +0 -0
  98. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/type_spec/external/api/inputs/get_input_data.yaml +0 -0
  99. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/type_spec/external/api/inputs/get_input_names.yaml +0 -0
  100. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/type_spec/external/api/inputs/get_inputs_data.yaml +0 -0
  101. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/type_spec/external/api/inputs/set_input_attribute_values.yaml +0 -0
  102. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/type_spec/external/api/outputs/get_output_data.yaml +0 -0
  103. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/type_spec/external/api/outputs/get_output_names.yaml +0 -0
  104. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/type_spec/external/api/outputs/resolve_output_conditions.yaml +0 -0
  105. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/type_spec/external/api/permissions/set_core_permissions.yaml +0 -0
  106. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/type_spec/external/api/project/get_projects.yaml +0 -0
  107. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/type_spec/external/api/project/get_projects_data.yaml +0 -0
  108. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/type_spec/external/api/recipe_links/create_recipe_link.yaml +0 -0
  109. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/type_spec/external/api/recipe_metadata/get_recipe_metadata_data.yaml +0 -0
  110. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/type_spec/external/api/recipes/associate_recipe_as_input.yaml +0 -0
  111. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/type_spec/external/api/recipes/associate_recipe_as_lot.yaml +0 -0
  112. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/type_spec/external/api/recipes/create_recipe.yaml +0 -0
  113. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/type_spec/external/api/recipes/create_recipes.yaml +0 -0
  114. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/type_spec/external/api/recipes/disassociate_recipe_as_input.yaml +0 -0
  115. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/type_spec/external/api/recipes/edit_recipe_inputs.yaml +0 -0
  116. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/type_spec/external/api/recipes/get_curve.yaml +0 -0
  117. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/type_spec/external/api/recipes/get_recipe_calculations.yaml +0 -0
  118. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/type_spec/external/api/recipes/get_recipe_links.yaml +0 -0
  119. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/type_spec/external/api/recipes/get_recipe_names.yaml +0 -0
  120. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/type_spec/external/api/recipes/get_recipe_output_metadata.yaml +0 -0
  121. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/type_spec/external/api/recipes/get_recipes_data.yaml +0 -0
  122. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/type_spec/external/api/recipes/set_recipe_inputs.yaml +0 -0
  123. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/type_spec/external/api/recipes/set_recipe_metadata.yaml +0 -0
  124. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/type_spec/external/api/recipes/set_recipe_outputs.yaml +0 -0
  125. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/type_spec/external/api/recipes/set_recipe_tags.yaml +0 -0
  126. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/type_spec/external/api/triggers/run_trigger.yaml +0 -0
  127. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/__init__.py +0 -0
  128. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/core/async_batch.py +0 -0
  129. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/core/file_upload.py +0 -0
  130. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/integration/__init__.py +0 -0
  131. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/integration/construct_client.py +0 -0
  132. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/integration/cron.py +0 -0
  133. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/integration/db/__init__.py +0 -0
  134. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/integration/db/connect.py +0 -0
  135. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/integration/entrypoint.py +0 -0
  136. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/integration/executors/__init__.py +0 -0
  137. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/integration/executors/script_executor.py +0 -0
  138. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/integration/job.py +0 -0
  139. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/integration/server.py +0 -0
  140. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/integration/types.py +0 -0
  141. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/py.typed +0 -0
  142. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/types/api/__init__.py +0 -0
  143. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/types/api/batch/__init__.py +0 -0
  144. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/types/api/batch/execute_batch.py +0 -0
  145. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/types/api/batch/execute_batch_load_async.py +0 -0
  146. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/types/api/chemical/__init__.py +0 -0
  147. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/types/api/chemical/convert_chemical_formats.py +0 -0
  148. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/types/api/entity/__init__.py +0 -0
  149. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/types/api/entity/create_entities.py +0 -0
  150. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/types/api/entity/create_entity.py +0 -0
  151. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/types/api/entity/get_entities_data.py +0 -0
  152. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/types/api/entity/list_entities.py +0 -0
  153. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/types/api/entity/resolve_entity_ids.py +0 -0
  154. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/types/api/entity/set_values.py +0 -0
  155. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/types/api/entity/transition_entity_phase.py +0 -0
  156. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/types/api/id_source/__init__.py +0 -0
  157. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/types/api/id_source/list_id_source.py +0 -0
  158. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/types/api/id_source/match_id_source.py +0 -0
  159. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/types/api/input_groups/__init__.py +0 -0
  160. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/types/api/input_groups/get_input_group_names.py +0 -0
  161. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/types/api/inputs/__init__.py +0 -0
  162. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/types/api/inputs/create_inputs.py +0 -0
  163. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/types/api/inputs/get_input_data.py +0 -0
  164. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/types/api/inputs/get_input_names.py +0 -0
  165. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/types/api/inputs/get_inputs_data.py +0 -0
  166. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/types/api/inputs/set_input_attribute_values.py +0 -0
  167. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/types/api/outputs/__init__.py +0 -0
  168. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/types/api/outputs/get_output_data.py +0 -0
  169. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/types/api/outputs/get_output_names.py +0 -0
  170. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/types/api/outputs/resolve_output_conditions.py +0 -0
  171. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/types/api/permissions/__init__.py +0 -0
  172. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/types/api/permissions/set_core_permissions.py +0 -0
  173. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/types/api/project/__init__.py +0 -0
  174. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/types/api/project/get_projects.py +0 -0
  175. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/types/api/project/get_projects_data.py +0 -0
  176. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/types/api/recipe_links/__init__.py +0 -0
  177. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/types/api/recipe_links/create_recipe_link.py +0 -0
  178. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/types/api/recipe_metadata/__init__.py +0 -0
  179. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/types/api/recipe_metadata/get_recipe_metadata_data.py +0 -0
  180. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/types/api/recipes/__init__.py +0 -0
  181. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/types/api/recipes/associate_recipe_as_input.py +0 -0
  182. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/types/api/recipes/associate_recipe_as_lot.py +0 -0
  183. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/types/api/recipes/create_recipe.py +0 -0
  184. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/types/api/recipes/create_recipes.py +0 -0
  185. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/types/api/recipes/disassociate_recipe_as_input.py +0 -0
  186. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/types/api/recipes/edit_recipe_inputs.py +0 -0
  187. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/types/api/recipes/get_curve.py +0 -0
  188. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/types/api/recipes/get_recipe_calculations.py +0 -0
  189. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/types/api/recipes/get_recipe_links.py +0 -0
  190. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/types/api/recipes/get_recipe_names.py +0 -0
  191. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/types/api/recipes/get_recipe_output_metadata.py +0 -0
  192. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/types/api/recipes/get_recipes_data.py +0 -0
  193. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/types/api/recipes/set_recipe_inputs.py +0 -0
  194. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/types/api/recipes/set_recipe_metadata.py +0 -0
  195. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/types/api/recipes/set_recipe_outputs.py +0 -0
  196. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/types/api/recipes/set_recipe_tags.py +0 -0
  197. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/types/api/triggers/__init__.py +0 -0
  198. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/types/api/triggers/run_trigger.py +0 -0
  199. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/types/async_batch_processor.py +0 -0
  200. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/types/base.py +0 -0
  201. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/types/calculations.py +0 -0
  202. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/types/chemical_structure.py +0 -0
  203. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/types/curves.py +0 -0
  204. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/types/entity.py +0 -0
  205. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/types/experiment_groups.py +0 -0
  206. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/types/field_values.py +0 -0
  207. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/types/fields.py +0 -0
  208. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/types/id_source.py +0 -0
  209. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/types/identifier.py +0 -0
  210. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/types/input_attributes.py +0 -0
  211. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/types/inputs.py +0 -0
  212. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/types/outputs.py +0 -0
  213. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/types/permissions.py +0 -0
  214. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/types/phases.py +0 -0
  215. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/types/post_base.py +0 -0
  216. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/types/recipe_identifiers.py +0 -0
  217. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/types/recipe_inputs.py +0 -0
  218. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/types/recipe_links.py +0 -0
  219. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/types/recipe_metadata.py +0 -0
  220. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/types/recipe_output_metadata.py +0 -0
  221. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/types/recipe_tags.py +0 -0
  222. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/types/recipe_workflow_steps.py +0 -0
  223. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/types/response.py +0 -0
  224. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/types/units.py +0 -0
  225. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/types/users.py +0 -0
  226. {uncountablepythonsdk-0.0.23 → uncountablepythonsdk-0.0.25}/uncountable/types/workflows.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: UncountablePythonSDK
3
- Version: 0.0.23
3
+ Version: 0.0.25
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.23
3
+ Version: 0.0.25
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
@@ -95,6 +95,7 @@ type_spec/external/api/project/get_projects.yaml
95
95
  type_spec/external/api/project/get_projects_data.yaml
96
96
  type_spec/external/api/recipe_links/create_recipe_link.yaml
97
97
  type_spec/external/api/recipe_metadata/get_recipe_metadata_data.yaml
98
+ type_spec/external/api/recipes/archive_recipes.yaml
98
99
  type_spec/external/api/recipes/associate_recipe_as_input.yaml
99
100
  type_spec/external/api/recipes/associate_recipe_as_lot.yaml
100
101
  type_spec/external/api/recipes/create_recipe.yaml
@@ -200,6 +201,7 @@ uncountable/types/api/recipe_links/create_recipe_link.py
200
201
  uncountable/types/api/recipe_metadata/__init__.py
201
202
  uncountable/types/api/recipe_metadata/get_recipe_metadata_data.py
202
203
  uncountable/types/api/recipes/__init__.py
204
+ uncountable/types/api/recipes/archive_recipes.py
203
205
  uncountable/types/api/recipes/associate_recipe_as_input.py
204
206
  uncountable/types/api/recipes/associate_recipe_as_lot.py
205
207
  uncountable/types/api/recipes/create_recipe.py
@@ -1,4 +1,5 @@
1
- from uncountable.core import AuthDetailsApiKey, Client
1
+ from uncountable.core import Client
2
+ from uncountable.core.client import AuthDetailsOAuth
2
3
  from uncountable.types import (
3
4
  entity_t,
4
5
  field_values_t,
@@ -7,9 +8,8 @@ from uncountable.types import (
7
8
 
8
9
  client = Client(
9
10
  base_url="https://app.uncountable.com",
10
- auth_details=AuthDetailsApiKey(
11
- api_id="X",
12
- api_secret_key="X",
11
+ auth_details=AuthDetailsOAuth(
12
+ refresh_token="x"
13
13
  ),
14
14
  )
15
15
  entities = client.create_entity(
@@ -174,6 +174,18 @@ class OpenAPIObjectType(OpenAPIType):
174
174
 
175
175
  return {"description": desc}
176
176
 
177
+ def _emit_property(
178
+ self, property_name: str, property_type: OpenAPIType
179
+ ) -> dict[str, object]:
180
+ property_info = {
181
+ **property_type.asdict(),
182
+ }
183
+ property_description = self._emit_property_desc(property_name)
184
+ if "$ref" in property_info and "description" in property_description:
185
+ return {"allOf": [property_info, property_description]}
186
+
187
+ return property_info | property_description
188
+
177
189
  def asdict(self) -> dict[str, object]:
178
190
  return self.add_addl_info({
179
191
  "type": "object",
@@ -183,10 +195,7 @@ class OpenAPIObjectType(OpenAPIType):
183
195
  if not property_type.nullable
184
196
  ],
185
197
  "properties": {
186
- property_name: {
187
- **property_type.asdict(),
188
- }
189
- | self._emit_property_desc(property_name)
198
+ property_name: self._emit_property(property_name, property_type)
190
199
  for property_name, property_type in self.properties.items()
191
200
  },
192
201
  })
@@ -0,0 +1,20 @@
1
+ $endpoint:
2
+ is_sdk: true
3
+ method: post
4
+ path: ${external}/recipes/archive
5
+ function: main.site.app.external.recipes.archive_recipes.archive_recipes
6
+ desc: Archive the provided recipes and their children
7
+
8
+ Arguments:
9
+ type: Object
10
+ properties:
11
+ recipes:
12
+ type: List<identifier.IdentifierKey>
13
+ desc: Identifier for the recipe
14
+ reason?:
15
+ type: String
16
+ desc: This reason will be written to the audit log archive entry
17
+
18
+
19
+ Data:
20
+ type: Object
@@ -0,0 +1,6 @@
1
+ from .client import Client
2
+ from .types import AuthDetailsApiKey, AuthDetailsOAuth
3
+ from .file_upload import MediaFileUpload, UploadedFile
4
+ from .async_batch import AsyncBatchProcessor
5
+
6
+ __all__: list[str] = ["AuthDetailsApiKey", "AuthDetailsOAuth", "AsyncBatchProcessor", "Client", "MediaFileUpload", "UploadedFile"]
@@ -1,4 +1,5 @@
1
1
  import base64
2
+ from datetime import datetime, timedelta
2
3
  import json
3
4
  import typing
4
5
  from dataclasses import dataclass
@@ -14,7 +15,7 @@ from pkgs.serialization_util.serialization_helpers import JsonValue
14
15
  from uncountable.types.client_base import APIRequest, ClientMethods
15
16
 
16
17
  from .file_upload import FileUpload, FileUploader, UploadedFile
17
- from .types import AuthDetails, AuthDetailsApiKey
18
+ from .types import AuthDetails, AuthDetailsApiKey, AuthDetailsOAuth
18
19
 
19
20
  DT = typing.TypeVar("DT")
20
21
 
@@ -48,11 +49,13 @@ class HTTPPostRequest(HTTPRequestBase):
48
49
  HTTPRequest = HTTPPostRequest | HTTPGetRequest
49
50
 
50
51
 
51
-
52
52
  @dataclass(kw_only=True)
53
- class ClientConfig():
53
+ class ClientConfig:
54
54
  allow_insecure_tls: bool = False
55
-
55
+
56
+
57
+ OAUTH_REFRESH_WINDOW_SECONDS = 60 * 5
58
+
56
59
 
57
60
  class APIResponseError(BaseException):
58
61
  status_code: int
@@ -107,19 +110,60 @@ class SDKError(BaseException):
107
110
  return f"internal SDK error, please contact Uncountable support: {self.message}"
108
111
 
109
112
 
113
+ @dataclass(kw_only=True)
114
+ class OAuthBearerTokenCache:
115
+ token: str
116
+ expires_at: datetime
117
+
118
+
119
+ @dataclass(kw_only=True)
120
+ class GetOauthBearerTokenData:
121
+ access_token: str
122
+ expires_in: int
123
+ token_type: str
124
+ scope: str
125
+
126
+
127
+ oauth_bearer_token_data_parser = CachedParser(GetOauthBearerTokenData)
128
+
129
+
110
130
  class Client(ClientMethods):
111
131
  _parser_map: dict[type, CachedParser] = {}
112
132
  _auth_details: AuthDetails
113
133
  _base_url: str
114
134
  _file_uploader: FileUploader
115
135
  _cfg: ClientConfig
136
+ _oauth_bearer_token_cache: OAuthBearerTokenCache | None = None
116
137
 
117
- def __init__(self, *, base_url: str, auth_details: AuthDetails, config: ClientConfig | None = None):
138
+ def __init__(
139
+ self,
140
+ *,
141
+ base_url: str,
142
+ auth_details: AuthDetails,
143
+ config: ClientConfig | None = None,
144
+ ):
118
145
  self._auth_details = auth_details
119
146
  self._base_url = base_url
120
147
  self._file_uploader = FileUploader(self._base_url, self._auth_details)
121
148
  self._cfg = config or ClientConfig()
122
149
 
150
+ def _get_response_json(self, response: requests.Response) -> dict[str, JsonValue]:
151
+ if response.status_code < 200 or response.status_code > 299:
152
+ extra_details: dict[str, JsonValue] | None = None
153
+ try:
154
+ data = response.json()
155
+ if "error" in data:
156
+ extra_details = data["error"]
157
+ except JSONDecodeError:
158
+ pass
159
+ raise APIResponseError.construct_error(
160
+ status_code=response.status_code, extra_details=extra_details
161
+ )
162
+ try:
163
+ return response.json()
164
+ except JSONDecodeError:
165
+ raise SDKError("unable to process response")
166
+
123
167
  def do_request(self, *, api_request: APIRequest, return_type: type[DT]) -> DT:
124
168
  http_request = self._build_http_request(api_request=api_request)
125
169
  match http_request:
@@ -128,7 +172,7 @@ class Client(ClientMethods):
128
172
  http_request.url,
129
173
  headers=http_request.headers,
130
174
  params=http_request.query_params,
131
- verify=not self._cfg.allow_insecure_tls
175
+ verify=not self._cfg.allow_insecure_tls,
132
176
  )
133
177
  case HTTPPostRequest():
134
178
  response = requests.post(
@@ -136,26 +180,16 @@ class Client(ClientMethods):
136
180
  headers=http_request.headers,
137
181
  data=http_request.body,
138
182
  params=http_request.query_params,
139
- verify=not self._cfg.allow_insecure_tls
183
+ verify=not self._cfg.allow_insecure_tls,
140
184
  )
141
185
  case _:
142
186
  typing.assert_never(http_request)
143
- if response.status_code < 200 or response.status_code > 299:
144
- extra_details: dict[str, JsonValue] | None = None
145
- try:
146
- data = response.json()
147
- if "error" in data:
148
- extra_details = data["error"]
149
- except JSONDecodeError:
150
- pass
151
- raise APIResponseError.construct_error(
152
- status_code=response.status_code, extra_details=extra_details
153
- )
187
+ response_data = self._get_response_json(response)
154
188
  cached_parser = self._get_cached_parser(return_type)
155
189
  try:
156
- data = response.json()["data"]
190
+ data = response_data["data"]
157
191
  return cached_parser.parse_api(data)
158
- except ValueError | JSONDecodeError:
192
+ except ValueError | JSONDecodeError | KeyError:
159
193
  raise SDKError("unable to process response")
160
194
 
161
195
  def _get_cached_parser(self, data_type: type[DT]) -> CachedParser[DT]:
@@ -163,6 +197,32 @@ class Client(ClientMethods):
163
197
  self._parser_map[data_type] = CachedParser(data_type)
164
198
  return self._parser_map[data_type]
165
199
 
200
+ def _get_oauth_bearer_token(self, *, oauth_details: AuthDetailsOAuth) -> str:
201
+ if (
202
+ self._oauth_bearer_token_cache is None
203
+ or (
204
+ self._oauth_bearer_token_cache.expires_at - datetime.now()
205
+ ).total_seconds()
206
+ < OAUTH_REFRESH_WINDOW_SECONDS
207
+ ):
208
+ refresh_url = urljoin(self._base_url, "/token/get_bearer_token")
209
+ response = requests.post(
210
+ refresh_url,
211
+ data={
212
+ "client_secret": oauth_details.refresh_token,
213
+ "scope": oauth_details.scope,
214
+ "grant_type": "client_credentials",
215
+ },
216
+ )
217
+ data = self._get_response_json(response)
218
+ token_data = oauth_bearer_token_data_parser.parse_storage(data)
219
+ self._oauth_bearer_token_cache = OAuthBearerTokenCache(
220
+ token=token_data.access_token,
221
+ expires_at=datetime.now() + timedelta(seconds=token_data.expires_in),
222
+ )
223
+
224
+ return self._oauth_bearer_token_cache.token
225
+
166
226
  def _build_auth_headers(self) -> dict[str, str]:
167
227
  match self._auth_details:
168
228
  case AuthDetailsApiKey():
@@ -170,6 +230,9 @@ class Client(ClientMethods):
170
230
  f"{self._auth_details.api_id}:{self._auth_details.api_secret_key}".encode()
171
231
  ).decode("utf-8")
172
232
  return {"Authorization": f"Basic {encoded}"}
233
+ case AuthDetailsOAuth():
234
+ token = self._get_oauth_bearer_token(oauth_details=self._auth_details)
235
+ return {"Authorization": f"Bearer {token}"}
173
236
  typing.assert_never(self._auth_details)
174
237
 
175
238
  def _build_http_request(self, *, api_request: APIRequest) -> HTTPRequest:
@@ -0,0 +1,16 @@
1
+ from dataclasses import dataclass
2
+
3
+
4
+ @dataclass(kw_only=True)
5
+ class AuthDetailsApiKey:
6
+ api_id: str
7
+ api_secret_key: str
8
+
9
+
10
+ @dataclass(kw_only=True)
11
+ class AuthDetailsOAuth:
12
+ refresh_token: str
13
+ scope: str = "unc.rnd"
14
+
15
+
16
+ AuthDetails = AuthDetailsApiKey | AuthDetailsOAuth
@@ -3,6 +3,7 @@
3
3
  # ruff: noqa: E402
4
4
  # fmt: off
5
5
  # isort: skip_file
6
+ from .api.recipes import archive_recipes as archive_recipes_t
6
7
  from .api.recipes import associate_recipe_as_input as associate_recipe_as_input_t
7
8
  from .api.recipes import associate_recipe_as_lot as associate_recipe_as_lot_t
8
9
  from . import async_batch as async_batch_t
@@ -77,6 +78,7 @@ from . import workflows as workflows_t
77
78
 
78
79
 
79
80
  __all__: list[str] = [
81
+ "archive_recipes_t",
80
82
  "associate_recipe_as_input_t",
81
83
  "associate_recipe_as_lot_t",
82
84
  "async_batch_t",
@@ -0,0 +1,35 @@
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 identifier as identifier_t
12
+
13
+ __all__: list[str] = [
14
+ "Arguments",
15
+ "Data",
16
+ "ENDPOINT_METHOD",
17
+ "ENDPOINT_PATH",
18
+ ]
19
+
20
+ ENDPOINT_METHOD = "POST"
21
+ ENDPOINT_PATH = "api/external/recipes/archive"
22
+
23
+
24
+ # DO NOT MODIFY -- This file is generated by type_spec
25
+ @dataclass(kw_only=True)
26
+ class Arguments:
27
+ recipes: list[identifier_t.IdentifierKey]
28
+ reason: typing.Optional[str] = None
29
+
30
+
31
+ # DO NOT MODIFY -- This file is generated by type_spec
32
+ @dataclass(kw_only=True)
33
+ class Data:
34
+ pass
35
+ # DO NOT MODIFY -- This file is generated by type_spec
@@ -26,6 +26,7 @@ class AsyncBatchRequestPath(StrEnum):
26
26
  SET_RECIPE_METADATA = "recipes/set_recipe_metadata"
27
27
  SET_RECIPE_TAGS = "recipes/set_recipe_tags"
28
28
  EDIT_RECIPE_INPUTS = "recipes/edit_recipe_inputs"
29
+ ARCHIVE_RECIPES = "recipes/archive"
29
30
 
30
31
 
31
32
  # DO NOT MODIFY -- This file is generated by type_spec
@@ -9,6 +9,7 @@ import typing # noqa: F401
9
9
  import datetime # noqa: F401
10
10
  from decimal import Decimal # noqa: F401
11
11
  from pkgs.serialization import OpaqueKey
12
+ import uncountable.types.api.recipes.archive_recipes as archive_recipes_t
12
13
  import uncountable.types.api.recipes.associate_recipe_as_input as associate_recipe_as_input_t
13
14
  import uncountable.types.api.recipes.associate_recipe_as_lot as associate_recipe_as_lot_t
14
15
  from uncountable.types import async_batch as async_batch_t
@@ -83,6 +84,28 @@ class ClientMethods(ABC):
83
84
  def do_request(self, *, api_request: APIRequest, return_type: type[DT]) -> DT:
84
85
  ...
85
86
 
87
+ def archive_recipes(
88
+ self,
89
+ *,
90
+ recipes: list[identifier_t.IdentifierKey],
91
+ reason: typing.Optional[str] = None,
92
+ ) -> archive_recipes_t.Data:
93
+ """Archive the provided recipes and their children
94
+
95
+ :param recipes: Identifier for the recipe
96
+ :param reason: This reason will be written to the audit log archive entry
97
+ """
98
+ args = archive_recipes_t.Arguments(
99
+ recipes=recipes,
100
+ reason=reason,
101
+ )
102
+ api_request = APIRequest(
103
+ method=archive_recipes_t.ENDPOINT_METHOD,
104
+ endpoint=archive_recipes_t.ENDPOINT_PATH,
105
+ args=args,
106
+ )
107
+ return self.do_request(api_request=api_request, return_type=archive_recipes_t.Data)
108
+
86
109
  def associate_recipe_as_input(
87
110
  self,
88
111
  *,
@@ -1,5 +0,0 @@
1
- from .client import AuthDetailsApiKey, Client
2
- from .file_upload import MediaFileUpload, UploadedFile
3
- from .async_batch import AsyncBatchProcessor
4
-
5
- __all__: list[str] = ["AuthDetailsApiKey", "AsyncBatchProcessor", "Client", "MediaFileUpload", "UploadedFile"]
@@ -1,22 +0,0 @@
1
- import base64
2
- import json
3
- import typing
4
- from dataclasses import dataclass
5
- from enum import StrEnum
6
- from urllib.parse import urljoin
7
-
8
- import aiohttp
9
- import requests
10
-
11
- from pkgs.argument_parser import CachedParser
12
- from pkgs.serialization_util import serialize_for_api
13
- from uncountable.types.client_base import APIRequest, ClientMethods
14
-
15
-
16
- @dataclass(kw_only=True)
17
- class AuthDetailsApiKey:
18
- api_id: str
19
- api_secret_key: str
20
-
21
-
22
- AuthDetails = AuthDetailsApiKey