UncountablePythonSDK 0.0.20__tar.gz → 0.0.22__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 (223) hide show
  1. {uncountablepythonsdk-0.0.20/UncountablePythonSDK.egg-info → uncountablepythonsdk-0.0.22}/PKG-INFO +3 -1
  2. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22/UncountablePythonSDK.egg-info}/PKG-INFO +3 -1
  3. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/UncountablePythonSDK.egg-info/SOURCES.txt +21 -0
  4. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/UncountablePythonSDK.egg-info/requires.txt +2 -0
  5. uncountablepythonsdk-0.0.22/examples/async_batch.py +36 -0
  6. uncountablepythonsdk-0.0.22/examples/upload_files.py +19 -0
  7. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/pkgs/type_spec/actions_registry/__main__.py +35 -23
  8. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/pkgs/type_spec/actions_registry/emit_typescript.py +71 -9
  9. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/pkgs/type_spec/builder.py +125 -8
  10. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/pkgs/type_spec/config.py +1 -0
  11. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/pkgs/type_spec/emit_open_api.py +197 -16
  12. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/pkgs/type_spec/emit_open_api_util.py +18 -0
  13. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/pkgs/type_spec/emit_python.py +241 -55
  14. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/pkgs/type_spec/load_types.py +48 -5
  15. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/pkgs/type_spec/open_api_util.py +13 -33
  16. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/pkgs/type_spec/type_info/emit_type_info.py +129 -8
  17. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/pyproject.toml +2 -0
  18. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/type_spec/external/api/entity/create_entities.yaml +13 -1
  19. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/type_spec/external/api/entity/create_entity.yaml +13 -1
  20. uncountablepythonsdk-0.0.22/type_spec/external/api/entity/transition_entity_phase.yaml +44 -0
  21. uncountablepythonsdk-0.0.22/type_spec/external/api/permissions/set_core_permissions.yaml +69 -0
  22. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/type_spec/external/api/recipes/associate_recipe_as_input.yaml +4 -4
  23. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/type_spec/external/api/recipes/create_recipe.yaml +2 -1
  24. uncountablepythonsdk-0.0.22/type_spec/external/api/recipes/disassociate_recipe_as_input.yaml +16 -0
  25. uncountablepythonsdk-0.0.22/type_spec/external/api/recipes/edit_recipe_inputs.yaml +86 -0
  26. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/type_spec/external/api/recipes/get_curve.yaml +4 -1
  27. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/type_spec/external/api/recipes/get_recipes_data.yaml +6 -0
  28. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/type_spec/external/api/recipes/set_recipe_metadata.yaml +1 -0
  29. uncountablepythonsdk-0.0.22/type_spec/external/api/recipes/set_recipe_tags.yaml +62 -0
  30. uncountablepythonsdk-0.0.22/uncountable/core/__init__.py +5 -0
  31. uncountablepythonsdk-0.0.22/uncountable/core/async_batch.py +22 -0
  32. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/uncountable/core/client.py +84 -10
  33. uncountablepythonsdk-0.0.22/uncountable/core/file_upload.py +95 -0
  34. uncountablepythonsdk-0.0.22/uncountable/core/types.py +22 -0
  35. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/uncountable/types/__init__.py +18 -0
  36. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/uncountable/types/api/entity/create_entities.py +1 -1
  37. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/uncountable/types/api/entity/create_entity.py +1 -1
  38. uncountablepythonsdk-0.0.22/uncountable/types/api/entity/transition_entity_phase.py +66 -0
  39. uncountablepythonsdk-0.0.22/uncountable/types/api/permissions/set_core_permissions.py +89 -0
  40. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/uncountable/types/api/recipes/associate_recipe_as_input.py +4 -3
  41. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/uncountable/types/api/recipes/create_recipe.py +1 -1
  42. uncountablepythonsdk-0.0.22/uncountable/types/api/recipes/disassociate_recipe_as_input.py +35 -0
  43. uncountablepythonsdk-0.0.22/uncountable/types/api/recipes/edit_recipe_inputs.py +106 -0
  44. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/uncountable/types/api/recipes/get_curve.py +2 -1
  45. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/uncountable/types/api/recipes/get_recipes_data.py +2 -0
  46. uncountablepythonsdk-0.0.22/uncountable/types/api/recipes/set_recipe_tags.py +91 -0
  47. uncountablepythonsdk-0.0.22/uncountable/types/api/triggers/__init__.py +1 -0
  48. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/uncountable/types/async_batch.py +10 -0
  49. uncountablepythonsdk-0.0.22/uncountable/types/async_batch_processor.py +154 -0
  50. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/uncountable/types/client_base.py +113 -48
  51. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/uncountable/types/identifier.py +3 -3
  52. uncountablepythonsdk-0.0.22/uncountable/types/permissions.py +46 -0
  53. uncountablepythonsdk-0.0.22/uncountable/types/post_base.py +30 -0
  54. uncountablepythonsdk-0.0.22/uncountable/types/recipe_inputs.py +30 -0
  55. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/uncountable/types/recipe_metadata.py +2 -0
  56. uncountablepythonsdk-0.0.22/uncountable/types/recipe_workflow_steps.py +77 -0
  57. uncountablepythonsdk-0.0.20/uncountable/core/__init__.py +0 -3
  58. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/.github/workflows/documentation.yml +0 -0
  59. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/.github/workflows/publish.yml +0 -0
  60. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/.gitignore +0 -0
  61. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/README.md +0 -0
  62. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/UncountablePythonSDK.egg-info/dependency_links.txt +0 -0
  63. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/UncountablePythonSDK.egg-info/top_level.txt +0 -0
  64. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/docs/.gitignore +0 -0
  65. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/docs/conf.py +0 -0
  66. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/docs/index.md +0 -0
  67. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/docs/justfile +0 -0
  68. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/docs/quickstart.md +0 -0
  69. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/docs/requirements.txt +0 -0
  70. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/docs/static/favicons/android-chrome-192x192.png +0 -0
  71. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/docs/static/favicons/android-chrome-512x512.png +0 -0
  72. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/docs/static/favicons/apple-touch-icon.png +0 -0
  73. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/docs/static/favicons/browserconfig.xml +0 -0
  74. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/docs/static/favicons/favicon-16x16.png +0 -0
  75. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/docs/static/favicons/favicon-32x32.png +0 -0
  76. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/docs/static/favicons/manifest.json +0 -0
  77. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/docs/static/favicons/mstile-150x150.png +0 -0
  78. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/docs/static/favicons/safari-pinned-tab.svg +0 -0
  79. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/docs/static/logo_blue.png +0 -0
  80. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/examples/create_entity.py +0 -0
  81. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/examples/recipe-import/importer.py +0 -0
  82. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/pkgs/__init__.py +0 -0
  83. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/pkgs/argument_parser/__init__.py +0 -0
  84. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/pkgs/argument_parser/_is_enum.py +0 -0
  85. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/pkgs/argument_parser/_is_namedtuple.py +0 -0
  86. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/pkgs/argument_parser/argument_parser.py +0 -0
  87. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/pkgs/argument_parser/case_convert.py +0 -0
  88. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/pkgs/serialization/__init__.py +0 -0
  89. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/pkgs/serialization/missing_sentry.py +0 -0
  90. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/pkgs/serialization/opaque_key.py +0 -0
  91. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/pkgs/serialization/serial_class.py +0 -0
  92. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/pkgs/serialization_util/__init__.py +0 -0
  93. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/pkgs/serialization_util/_get_type_for_serialization.py +0 -0
  94. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/pkgs/serialization_util/serialization_helpers.py +0 -0
  95. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/pkgs/strenum_compat/__init__.py +0 -0
  96. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/pkgs/strenum_compat/strenum_compat.py +0 -0
  97. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/pkgs/type_spec/__init__.py +0 -0
  98. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/pkgs/type_spec/__main__.py +0 -0
  99. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/pkgs/type_spec/actions_registry/__init__.py +0 -0
  100. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/pkgs/type_spec/emit_io_ts.py +0 -0
  101. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/pkgs/type_spec/emit_typescript.py +0 -0
  102. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/pkgs/type_spec/emit_typescript_util.py +0 -0
  103. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/pkgs/type_spec/parts/base.py.prepart +0 -0
  104. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/pkgs/type_spec/parts/base.ts.prepart +0 -0
  105. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/pkgs/type_spec/test.py +0 -0
  106. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/pkgs/type_spec/type_info/__main__.py +0 -0
  107. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/pkgs/type_spec/util.py +0 -0
  108. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/pkgs/type_spec/value_spec/__init__.py +0 -0
  109. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/pkgs/type_spec/value_spec/__main__.py +0 -0
  110. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/pkgs/type_spec/value_spec/convert_type.py +0 -0
  111. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/pkgs/type_spec/value_spec/emit_python.py +0 -0
  112. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/pkgs/type_spec/value_spec/types.py +0 -0
  113. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/setup.cfg +0 -0
  114. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/type_spec/external/api/batch/execute_batch.yaml +0 -0
  115. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/type_spec/external/api/batch/execute_batch_load_async.yaml +0 -0
  116. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/type_spec/external/api/chemical/convert_chemical_formats.yaml +0 -0
  117. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/type_spec/external/api/entity/get_entities_data.yaml +0 -0
  118. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/type_spec/external/api/entity/list_entities.yaml +0 -0
  119. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/type_spec/external/api/entity/resolve_entity_ids.yaml +0 -0
  120. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/type_spec/external/api/entity/set_values.yaml +0 -0
  121. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/type_spec/external/api/id_source/list_id_source.yaml +0 -0
  122. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/type_spec/external/api/id_source/match_id_source.yaml +0 -0
  123. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/type_spec/external/api/input_groups/get_input_group_names.yaml +0 -0
  124. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/type_spec/external/api/inputs/create_inputs.yaml +0 -0
  125. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/type_spec/external/api/inputs/get_input_data.yaml +0 -0
  126. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/type_spec/external/api/inputs/get_input_names.yaml +0 -0
  127. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/type_spec/external/api/inputs/get_inputs_data.yaml +0 -0
  128. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/type_spec/external/api/inputs/set_input_attribute_values.yaml +0 -0
  129. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/type_spec/external/api/outputs/get_output_data.yaml +0 -0
  130. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/type_spec/external/api/outputs/get_output_names.yaml +0 -0
  131. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/type_spec/external/api/outputs/resolve_output_conditions.yaml +0 -0
  132. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/type_spec/external/api/project/get_projects.yaml +0 -0
  133. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/type_spec/external/api/project/get_projects_data.yaml +0 -0
  134. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/type_spec/external/api/recipe_links/create_recipe_link.yaml +0 -0
  135. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/type_spec/external/api/recipe_metadata/get_recipe_metadata_data.yaml +0 -0
  136. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/type_spec/external/api/recipes/associate_recipe_as_lot.yaml +0 -0
  137. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/type_spec/external/api/recipes/create_recipes.yaml +0 -0
  138. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/type_spec/external/api/recipes/get_recipe_calculations.yaml +0 -0
  139. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/type_spec/external/api/recipes/get_recipe_links.yaml +0 -0
  140. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/type_spec/external/api/recipes/get_recipe_names.yaml +0 -0
  141. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/type_spec/external/api/recipes/get_recipe_output_metadata.yaml +0 -0
  142. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/type_spec/external/api/recipes/set_recipe_inputs.yaml +0 -0
  143. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/type_spec/external/api/recipes/set_recipe_outputs.yaml +0 -0
  144. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/type_spec/external/api/triggers/run_trigger.yaml +0 -0
  145. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/uncountable/__init__.py +0 -0
  146. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/uncountable/integration/__init__.py +0 -0
  147. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/uncountable/integration/construct_client.py +0 -0
  148. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/uncountable/integration/cron.py +0 -0
  149. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/uncountable/integration/db/__init__.py +0 -0
  150. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/uncountable/integration/db/connect.py +0 -0
  151. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/uncountable/integration/entrypoint.py +0 -0
  152. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/uncountable/integration/executors/__init__.py +0 -0
  153. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/uncountable/integration/executors/script_executor.py +0 -0
  154. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/uncountable/integration/job.py +0 -0
  155. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/uncountable/integration/server.py +0 -0
  156. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/uncountable/integration/types.py +0 -0
  157. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/uncountable/py.typed +0 -0
  158. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/uncountable/types/api/__init__.py +0 -0
  159. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/uncountable/types/api/batch/__init__.py +0 -0
  160. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/uncountable/types/api/batch/execute_batch.py +0 -0
  161. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/uncountable/types/api/batch/execute_batch_load_async.py +0 -0
  162. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/uncountable/types/api/chemical/__init__.py +0 -0
  163. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/uncountable/types/api/chemical/convert_chemical_formats.py +0 -0
  164. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/uncountable/types/api/entity/__init__.py +0 -0
  165. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/uncountable/types/api/entity/get_entities_data.py +0 -0
  166. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/uncountable/types/api/entity/list_entities.py +0 -0
  167. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/uncountable/types/api/entity/resolve_entity_ids.py +0 -0
  168. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/uncountable/types/api/entity/set_values.py +0 -0
  169. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/uncountable/types/api/id_source/__init__.py +0 -0
  170. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/uncountable/types/api/id_source/list_id_source.py +0 -0
  171. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/uncountable/types/api/id_source/match_id_source.py +0 -0
  172. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/uncountable/types/api/input_groups/__init__.py +0 -0
  173. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/uncountable/types/api/input_groups/get_input_group_names.py +0 -0
  174. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/uncountable/types/api/inputs/__init__.py +0 -0
  175. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/uncountable/types/api/inputs/create_inputs.py +0 -0
  176. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/uncountable/types/api/inputs/get_input_data.py +0 -0
  177. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/uncountable/types/api/inputs/get_input_names.py +0 -0
  178. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/uncountable/types/api/inputs/get_inputs_data.py +0 -0
  179. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/uncountable/types/api/inputs/set_input_attribute_values.py +0 -0
  180. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/uncountable/types/api/outputs/__init__.py +0 -0
  181. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/uncountable/types/api/outputs/get_output_data.py +0 -0
  182. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/uncountable/types/api/outputs/get_output_names.py +0 -0
  183. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/uncountable/types/api/outputs/resolve_output_conditions.py +0 -0
  184. {uncountablepythonsdk-0.0.20/uncountable/types/api/project → uncountablepythonsdk-0.0.22/uncountable/types/api/permissions}/__init__.py +0 -0
  185. {uncountablepythonsdk-0.0.20/uncountable/types/api/recipe_links → uncountablepythonsdk-0.0.22/uncountable/types/api/project}/__init__.py +0 -0
  186. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/uncountable/types/api/project/get_projects.py +0 -0
  187. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/uncountable/types/api/project/get_projects_data.py +0 -0
  188. {uncountablepythonsdk-0.0.20/uncountable/types/api/recipe_metadata → uncountablepythonsdk-0.0.22/uncountable/types/api/recipe_links}/__init__.py +0 -0
  189. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/uncountable/types/api/recipe_links/create_recipe_link.py +0 -0
  190. {uncountablepythonsdk-0.0.20/uncountable/types/api/recipes → uncountablepythonsdk-0.0.22/uncountable/types/api/recipe_metadata}/__init__.py +0 -0
  191. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/uncountable/types/api/recipe_metadata/get_recipe_metadata_data.py +0 -0
  192. {uncountablepythonsdk-0.0.20/uncountable/types/api/triggers → uncountablepythonsdk-0.0.22/uncountable/types/api/recipes}/__init__.py +0 -0
  193. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/uncountable/types/api/recipes/associate_recipe_as_lot.py +0 -0
  194. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/uncountable/types/api/recipes/create_recipes.py +0 -0
  195. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/uncountable/types/api/recipes/get_recipe_calculations.py +0 -0
  196. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/uncountable/types/api/recipes/get_recipe_links.py +0 -0
  197. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/uncountable/types/api/recipes/get_recipe_names.py +0 -0
  198. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/uncountable/types/api/recipes/get_recipe_output_metadata.py +0 -0
  199. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/uncountable/types/api/recipes/set_recipe_inputs.py +0 -0
  200. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/uncountable/types/api/recipes/set_recipe_metadata.py +0 -0
  201. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/uncountable/types/api/recipes/set_recipe_outputs.py +0 -0
  202. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/uncountable/types/api/triggers/run_trigger.py +0 -0
  203. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/uncountable/types/base.py +0 -0
  204. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/uncountable/types/calculations.py +0 -0
  205. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/uncountable/types/chemical_structure.py +0 -0
  206. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/uncountable/types/curves.py +0 -0
  207. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/uncountable/types/entity.py +0 -0
  208. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/uncountable/types/experiment_groups.py +0 -0
  209. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/uncountable/types/field_values.py +0 -0
  210. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/uncountable/types/fields.py +0 -0
  211. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/uncountable/types/id_source.py +0 -0
  212. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/uncountable/types/input_attributes.py +0 -0
  213. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/uncountable/types/inputs.py +0 -0
  214. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/uncountable/types/outputs.py +0 -0
  215. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/uncountable/types/phases.py +0 -0
  216. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/uncountable/types/recipe_identifiers.py +0 -0
  217. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/uncountable/types/recipe_links.py +0 -0
  218. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/uncountable/types/recipe_output_metadata.py +0 -0
  219. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/uncountable/types/recipe_tags.py +0 -0
  220. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/uncountable/types/response.py +0 -0
  221. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/uncountable/types/units.py +0 -0
  222. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/uncountable/types/users.py +0 -0
  223. {uncountablepythonsdk-0.0.20 → uncountablepythonsdk-0.0.22}/uncountable/types/workflows.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: UncountablePythonSDK
3
- Version: 0.0.20
3
+ Version: 0.0.22
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
@@ -16,6 +16,8 @@ Classifier: Topic :: Utilities
16
16
  Classifier: Typing :: Typed
17
17
  Requires-Python: >=3.11
18
18
  Description-Content-Type: text/markdown
19
+ Requires-Dist: aiotus==0.1.15
20
+ Requires-Dist: aiohttp==3.9.5
19
21
  Requires-Dist: requests==2.31.0
20
22
  Requires-Dist: SQLAlchemy==1.4.52
21
23
  Requires-Dist: APScheduler==3.10.4
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: UncountablePythonSDK
3
- Version: 0.0.20
3
+ Version: 0.0.22
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
@@ -16,6 +16,8 @@ Classifier: Topic :: Utilities
16
16
  Classifier: Typing :: Typed
17
17
  Requires-Python: >=3.11
18
18
  Description-Content-Type: text/markdown
19
+ Requires-Dist: aiotus==0.1.15
20
+ Requires-Dist: aiohttp==3.9.5
19
21
  Requires-Dist: requests==2.31.0
20
22
  Requires-Dist: SQLAlchemy==1.4.52
21
23
  Requires-Dist: APScheduler==3.10.4
@@ -24,7 +24,9 @@ docs/static/favicons/favicon-32x32.png
24
24
  docs/static/favicons/manifest.json
25
25
  docs/static/favicons/mstile-150x150.png
26
26
  docs/static/favicons/safari-pinned-tab.svg
27
+ examples/async_batch.py
27
28
  examples/create_entity.py
29
+ examples/upload_files.py
28
30
  examples/recipe-import/importer.py
29
31
  pkgs/__init__.py
30
32
  pkgs/argument_parser/__init__.py
@@ -76,6 +78,7 @@ type_spec/external/api/entity/get_entities_data.yaml
76
78
  type_spec/external/api/entity/list_entities.yaml
77
79
  type_spec/external/api/entity/resolve_entity_ids.yaml
78
80
  type_spec/external/api/entity/set_values.yaml
81
+ type_spec/external/api/entity/transition_entity_phase.yaml
79
82
  type_spec/external/api/id_source/list_id_source.yaml
80
83
  type_spec/external/api/id_source/match_id_source.yaml
81
84
  type_spec/external/api/input_groups/get_input_group_names.yaml
@@ -87,6 +90,7 @@ type_spec/external/api/inputs/set_input_attribute_values.yaml
87
90
  type_spec/external/api/outputs/get_output_data.yaml
88
91
  type_spec/external/api/outputs/get_output_names.yaml
89
92
  type_spec/external/api/outputs/resolve_output_conditions.yaml
93
+ type_spec/external/api/permissions/set_core_permissions.yaml
90
94
  type_spec/external/api/project/get_projects.yaml
91
95
  type_spec/external/api/project/get_projects_data.yaml
92
96
  type_spec/external/api/recipe_links/create_recipe_link.yaml
@@ -95,6 +99,8 @@ type_spec/external/api/recipes/associate_recipe_as_input.yaml
95
99
  type_spec/external/api/recipes/associate_recipe_as_lot.yaml
96
100
  type_spec/external/api/recipes/create_recipe.yaml
97
101
  type_spec/external/api/recipes/create_recipes.yaml
102
+ type_spec/external/api/recipes/disassociate_recipe_as_input.yaml
103
+ type_spec/external/api/recipes/edit_recipe_inputs.yaml
98
104
  type_spec/external/api/recipes/get_curve.yaml
99
105
  type_spec/external/api/recipes/get_recipe_calculations.yaml
100
106
  type_spec/external/api/recipes/get_recipe_links.yaml
@@ -104,11 +110,15 @@ type_spec/external/api/recipes/get_recipes_data.yaml
104
110
  type_spec/external/api/recipes/set_recipe_inputs.yaml
105
111
  type_spec/external/api/recipes/set_recipe_metadata.yaml
106
112
  type_spec/external/api/recipes/set_recipe_outputs.yaml
113
+ type_spec/external/api/recipes/set_recipe_tags.yaml
107
114
  type_spec/external/api/triggers/run_trigger.yaml
108
115
  uncountable/__init__.py
109
116
  uncountable/py.typed
110
117
  uncountable/core/__init__.py
118
+ uncountable/core/async_batch.py
111
119
  uncountable/core/client.py
120
+ uncountable/core/file_upload.py
121
+ uncountable/core/types.py
112
122
  uncountable/integration/__init__.py
113
123
  uncountable/integration/construct_client.py
114
124
  uncountable/integration/cron.py
@@ -122,6 +132,7 @@ uncountable/integration/executors/__init__.py
122
132
  uncountable/integration/executors/script_executor.py
123
133
  uncountable/types/__init__.py
124
134
  uncountable/types/async_batch.py
135
+ uncountable/types/async_batch_processor.py
125
136
  uncountable/types/base.py
126
137
  uncountable/types/calculations.py
127
138
  uncountable/types/chemical_structure.py
@@ -136,12 +147,16 @@ uncountable/types/identifier.py
136
147
  uncountable/types/input_attributes.py
137
148
  uncountable/types/inputs.py
138
149
  uncountable/types/outputs.py
150
+ uncountable/types/permissions.py
139
151
  uncountable/types/phases.py
152
+ uncountable/types/post_base.py
140
153
  uncountable/types/recipe_identifiers.py
154
+ uncountable/types/recipe_inputs.py
141
155
  uncountable/types/recipe_links.py
142
156
  uncountable/types/recipe_metadata.py
143
157
  uncountable/types/recipe_output_metadata.py
144
158
  uncountable/types/recipe_tags.py
159
+ uncountable/types/recipe_workflow_steps.py
145
160
  uncountable/types/response.py
146
161
  uncountable/types/units.py
147
162
  uncountable/types/users.py
@@ -159,6 +174,7 @@ uncountable/types/api/entity/get_entities_data.py
159
174
  uncountable/types/api/entity/list_entities.py
160
175
  uncountable/types/api/entity/resolve_entity_ids.py
161
176
  uncountable/types/api/entity/set_values.py
177
+ uncountable/types/api/entity/transition_entity_phase.py
162
178
  uncountable/types/api/id_source/__init__.py
163
179
  uncountable/types/api/id_source/list_id_source.py
164
180
  uncountable/types/api/id_source/match_id_source.py
@@ -174,6 +190,8 @@ uncountable/types/api/outputs/__init__.py
174
190
  uncountable/types/api/outputs/get_output_data.py
175
191
  uncountable/types/api/outputs/get_output_names.py
176
192
  uncountable/types/api/outputs/resolve_output_conditions.py
193
+ uncountable/types/api/permissions/__init__.py
194
+ uncountable/types/api/permissions/set_core_permissions.py
177
195
  uncountable/types/api/project/__init__.py
178
196
  uncountable/types/api/project/get_projects.py
179
197
  uncountable/types/api/project/get_projects_data.py
@@ -186,6 +204,8 @@ uncountable/types/api/recipes/associate_recipe_as_input.py
186
204
  uncountable/types/api/recipes/associate_recipe_as_lot.py
187
205
  uncountable/types/api/recipes/create_recipe.py
188
206
  uncountable/types/api/recipes/create_recipes.py
207
+ uncountable/types/api/recipes/disassociate_recipe_as_input.py
208
+ uncountable/types/api/recipes/edit_recipe_inputs.py
189
209
  uncountable/types/api/recipes/get_curve.py
190
210
  uncountable/types/api/recipes/get_recipe_calculations.py
191
211
  uncountable/types/api/recipes/get_recipe_links.py
@@ -195,5 +215,6 @@ uncountable/types/api/recipes/get_recipes_data.py
195
215
  uncountable/types/api/recipes/set_recipe_inputs.py
196
216
  uncountable/types/api/recipes/set_recipe_metadata.py
197
217
  uncountable/types/api/recipes/set_recipe_outputs.py
218
+ uncountable/types/api/recipes/set_recipe_tags.py
198
219
  uncountable/types/api/triggers/__init__.py
199
220
  uncountable/types/api/triggers/run_trigger.py
@@ -1,3 +1,5 @@
1
+ aiotus==0.1.15
2
+ aiohttp==3.9.5
1
3
  requests==2.31.0
2
4
  SQLAlchemy==1.4.52
3
5
  APScheduler==3.10.4
@@ -0,0 +1,36 @@
1
+ from decimal import Decimal
2
+ from uncountable.core import AuthDetailsApiKey, Client
3
+ from uncountable.core import AsyncBatchProcessor
4
+ from uncountable.types import (
5
+ recipe_metadata,
6
+ )
7
+ from uncountable.types.identifier import IdentifierKeyBatchReference
8
+ from uncountable.types.recipe_identifiers import (
9
+ RecipeIdentifierEditableName,
10
+ RecipeIdentifiers,
11
+ )
12
+
13
+
14
+ client = Client(
15
+ base_url="https://app.uncountable.com",
16
+ auth_details=AuthDetailsApiKey(
17
+ api_id="X",
18
+ api_secret_key="X",
19
+ ),
20
+ )
21
+ batch_loader = AsyncBatchProcessor(client=client)
22
+ recipe_identifiers: RecipeIdentifiers = []
23
+ recipe_identifiers.append(
24
+ RecipeIdentifierEditableName(editable_name="My recipe from API")
25
+ )
26
+ req = batch_loader.create_recipe(
27
+ material_family_id=1, workflow_id=1, identifiers=recipe_identifiers
28
+ )
29
+ created_recipe_reference = req.batch_reference
30
+ batch_loader.set_recipe_metadata(
31
+ recipe_key=IdentifierKeyBatchReference(reference=created_recipe_reference),
32
+ recipe_metadata=[
33
+ recipe_metadata.MetadataValue(metadata_id=7, value_numeric=Decimal(38))
34
+ ],
35
+ )
36
+ job_id = batch_loader.send()
@@ -0,0 +1,19 @@
1
+ import os
2
+ from pprint import pprint
3
+
4
+ from uncountable import AuthDetailsApiKey, Client, MediaFileUpload
5
+
6
+ client = Client(
7
+ base_url="http://localhost:5000",
8
+ auth_details=AuthDetailsApiKey(
9
+ api_id=os.environ["UNC_API_ID"],
10
+ api_secret_key=os.environ["UNC_API_SECRET_KEY"],
11
+ ),
12
+ )
13
+ uploaded = client.upload_files(
14
+ file_uploads=[
15
+ MediaFileUpload(path="/my/file/path.doc"),
16
+ MediaFileUpload(path="/my/file/path2.doc"),
17
+ ]
18
+ )
19
+ pprint(uploaded)
@@ -14,7 +14,7 @@ from pkgs.type_spec import builder
14
14
  from ...argument_parser import CachedParser
15
15
  from ..emit_typescript_util import ts_name
16
16
  from ..util import rewrite_file
17
- from .emit_typescript import emit_action_definitions
17
+ from .emit_typescript import ActionDefinitionWithArgument, emit_action_definitions
18
18
 
19
19
  key_name = "name"
20
20
  key_icon = "icon"
@@ -61,11 +61,11 @@ def get_action_registry_files_info() -> list[ActionRegistryFileInfo]:
61
61
 
62
62
  def main() -> None:
63
63
  files_info = get_action_registry_files_info()
64
- action_definitions: defaultdict[str, list[actions_registry_t.ActionDefinition]] = (
64
+ action_definitions: defaultdict[str, list[ActionDefinitionWithArgument]] = (
65
65
  defaultdict(list)
66
66
  )
67
- all_action_definitions: list[actions_registry_t.ActionDefinition] = []
68
-
67
+ all_action_definitions: list[actions_registry_t.ActionDefinitionInternal] = []
68
+ action_definitions_with_arguments_list: list[ActionDefinitionWithArgument] = []
69
69
  for file_info in files_info:
70
70
  in_action_definitions = action_definition_parser.parse_yaml_file(
71
71
  file_info.filepath
@@ -79,29 +79,41 @@ def main() -> None:
79
79
  modules.append(file_info.filename)
80
80
 
81
81
  module_str = "_".join(modules)
82
- all_action_definitions.append(
83
- actions_registry_t.ActionDefinition(
84
- name=definition.name,
85
- short_description=definition.short_description,
86
- description=definition.description,
87
- icon=definition.icon,
82
+ action_definition = actions_registry_t.ActionDefinitionInternal(
83
+ name=definition.name,
84
+ short_description=definition.short_description,
85
+ description=definition.description,
86
+ icon=definition.icon,
87
+ ref_name=ref_name,
88
+ module=actions_registry_t.ActionsRegistryModule(
89
+ ts_name(module_str, name_case=builder.NameCase.convert)
90
+ ),
91
+ visibility_scope=[
92
+ actions_registry_t.ActionDefinitionVisibilityScope(item)
93
+ for item in definition.visibility_scope
94
+ ]
95
+ if definition.visibility_scope is not None
96
+ else None,
97
+ )
98
+ action_definitions_with_arguments_list.append(
99
+ ActionDefinitionWithArgument(
100
+ module=module_str,
88
101
  ref_name=ref_name,
89
- module=actions_registry_t.ActionsRegistryModule(
90
- ts_name(module_str, name_case=builder.NameCase.convert)
91
- ),
92
- visibility_scope=[
93
- actions_registry_t.ActionDefinitionVisibilityScope(item)
94
- for item in definition.visibility_scope
95
- ]
96
- if definition.visibility_scope is not None
97
- else None,
102
+ arguments=definition.arguments,
103
+ definition=action_definition,
98
104
  )
99
105
  )
100
- all_action_definitions = sorted(
101
- all_action_definitions, key=lambda item: (item.module, item.ref_name)
106
+ all_action_definitions.append(action_definition)
107
+ action_definitions_with_arguments_list = sorted(
108
+ action_definitions_with_arguments_list,
109
+ key=lambda item: (item.module, item.ref_name),
102
110
  )
103
- for action_definition in all_action_definitions:
104
- action_definitions[action_definition.module].append(action_definition)
111
+
112
+ for action_definition_with_argument in action_definitions_with_arguments_list:
113
+ action_definitions[action_definition_with_argument.module].append(
114
+ action_definition_with_argument
115
+ )
116
+
105
117
  ts_content = emit_action_definitions(action_definitions)
106
118
  rewrite_file(
107
119
  "main/site/js/materials/base/actions_registry/action_definitions.tsx",
@@ -1,17 +1,34 @@
1
1
  import io
2
2
  from collections import defaultdict
3
+ from dataclasses import dataclass
3
4
 
4
5
  from main.base.types import actions_registry_t
5
6
 
6
7
  from ...type_spec import builder
7
- from ..emit_typescript_util import INDENT, MODIFY_NOTICE, ts_name
8
+ from ..emit_typescript_util import (
9
+ INDENT,
10
+ MODIFY_NOTICE,
11
+ resolve_namespace_ref,
12
+ ts_name,
13
+ ts_type_name,
14
+ )
8
15
  from ..util import encode_common_string
9
16
 
10
17
 
11
- def _action_symbol_name(action_definition: actions_registry_t.ActionDefinition) -> str:
18
+ def _action_symbol_name(
19
+ action_definition: actions_registry_t.ActionDefinitionInternal,
20
+ ) -> str:
12
21
  return f"{ts_name(action_definition.ref_name, name_case=builder.NameCase.convert)}"
13
22
 
14
23
 
24
+ def _action_type_name(ref_name: str) -> str:
25
+ return f"{ts_type_name(ref_name)}"
26
+
27
+
28
+ def _action_namespace_name(name: str) -> str:
29
+ return f"{resolve_namespace_ref(builder.SpecNamespace(name=name))}"
30
+
31
+
15
32
  def _action_module_name_base(module: str) -> str:
16
33
  return f"{ts_name(module, name_case=builder.NameCase.convert)}"
17
34
 
@@ -24,24 +41,54 @@ def _action_module_name(module: str) -> str:
24
41
  return f"ActionsRegistryT.ActionsRegistryModule.{_action_module_name_base(module)}"
25
42
 
26
43
 
44
+ @dataclass(kw_only=True)
45
+ class ActionDefinitionWithArgument:
46
+ module: str
47
+ ref_name: str
48
+ arguments: str | None
49
+ definition: actions_registry_t.ActionDefinitionInternal
50
+
51
+
52
+ def _emit_imports(
53
+ action_definitions: defaultdict[str, list[ActionDefinitionWithArgument]],
54
+ ) -> str:
55
+ out = io.StringIO()
56
+ namespaces = set()
57
+ for definitions in action_definitions.values():
58
+ for definition in definitions:
59
+ if definition.arguments is not None:
60
+ argument_parts = definition.arguments.split(".")
61
+ namespace = argument_parts[0]
62
+ namespaces.add(namespace)
63
+ namespaces_to_import = ", ".join(
64
+ sorted([f"type {_action_namespace_name(item)}" for item in list(namespaces)])
65
+ )
66
+ out.write(
67
+ f'import {{ ActionsRegistryT, {namespaces_to_import} }} from "unc_mat/types"\n\n'
68
+ )
69
+ out.write(MODIFY_NOTICE)
70
+ return out.getvalue()
71
+
72
+
27
73
  def emit_action_definitions(
28
- action_definitions: defaultdict[str, list[actions_registry_t.ActionDefinition]],
74
+ action_definitions: defaultdict[str, list[ActionDefinitionWithArgument]],
29
75
  ) -> str:
30
76
  out = io.StringIO()
31
77
  out.write(MODIFY_NOTICE)
32
78
  out.write("\n")
33
- out.write('import { ActionsRegistryT } from "unc_mat/types"\n\n')
34
- out.write(MODIFY_NOTICE)
79
+ out.write(_emit_imports(action_definitions))
35
80
  modules = []
36
81
  for key, values in action_definitions.items():
37
82
  out.write(MODIFY_NOTICE)
38
83
  modules.append(key)
39
84
  out.write(f"export const {_action_module_name_obj(key)} = {{\n")
40
- for action_definition in values:
85
+ for item in values:
41
86
  out.write(MODIFY_NOTICE)
42
- out.write(_emit_action_definition(action_definition, INDENT))
87
+ out.write(_emit_action_definition(item.definition, item.arguments, INDENT))
43
88
  out.write("}\n")
44
89
 
90
+ out.write(MODIFY_NOTICE)
91
+ out.write("\n")
45
92
  out.write(MODIFY_NOTICE)
46
93
  out.write("\n")
47
94
  out.write("export const actionDefinitions = {\n")
@@ -58,12 +105,27 @@ def emit_action_definitions(
58
105
  return out.getvalue()
59
106
 
60
107
 
108
+ def _get_argument_type(arguments: str | None) -> str | None:
109
+ if arguments is None:
110
+ return None
111
+ argument_parts = arguments.split(".")
112
+ namespace = argument_parts[0]
113
+ type_name = argument_parts[1]
114
+ if namespace is not None and type_name is not None:
115
+ return f"{_action_namespace_name(namespace)}.{type_name}"
116
+ return None
117
+
118
+
61
119
  def _emit_action_definition(
62
- action_definition: actions_registry_t.ActionDefinition, indent: str
120
+ action_definition: actions_registry_t.ActionDefinitionInternal,
121
+ arguments: str | None,
122
+ indent: str,
63
123
  ) -> str:
64
124
  out = io.StringIO()
65
125
 
66
126
  sub_indent = indent + INDENT
127
+ argument_type = _get_argument_type(arguments)
128
+ argument_type = f"<{argument_type}>" if argument_type is not None else ""
67
129
  out.write(f"{indent}{_action_symbol_name(action_definition)}: {{\n")
68
130
  out.write(f"{sub_indent}name: {encode_common_string(action_definition.name)},\n")
69
131
  if action_definition.icon is not None:
@@ -85,7 +147,7 @@ def _emit_action_definition(
85
147
  out.write(
86
148
  f"{sub_indent}visibilityScope: {_emit_visibility_scope(action_definition.visibility_scope)},\n"
87
149
  )
88
- out.write(f"{indent}}},\n")
150
+ out.write(f"{indent}}} as ActionsRegistryT.ActionDefinition{argument_type},\n")
89
151
  return out.getvalue()
90
152
 
91
153
 
@@ -10,7 +10,7 @@ import re
10
10
  from collections import defaultdict
11
11
  from dataclasses import MISSING, dataclass
12
12
  from enum import Enum, StrEnum, auto
13
- from typing import Any, Optional
13
+ from typing import Any, Optional, Self
14
14
 
15
15
  from . import util
16
16
  from .util import parse_type_str, unused
@@ -184,6 +184,34 @@ class SpecTypeInstance(SpecType):
184
184
  return defn_type + self.parameters
185
185
 
186
186
 
187
+ @dataclass(kw_only=True)
188
+ class SpecEndpointExample:
189
+ summary: str
190
+ description: str
191
+ arguments: dict[str, object]
192
+ data: dict[str, object]
193
+
194
+
195
+ @dataclass(kw_only=True)
196
+ class SpecGuide:
197
+ title: str
198
+ markdown_content: str
199
+ html_content: str
200
+
201
+
202
+ @dataclass(kw_only=True, frozen=True)
203
+ class RootGuideKey:
204
+ pass
205
+
206
+
207
+ @dataclass(kw_only=True, frozen=True)
208
+ class EndpointGuideKey:
209
+ path: str
210
+
211
+
212
+ SpecGuideKey = RootGuideKey | EndpointGuideKey
213
+
214
+
187
215
  class SpecTypeLiteralWrapper(SpecType):
188
216
  def __init__(
189
217
  self,
@@ -672,6 +700,32 @@ class ResultType(StrEnum):
672
700
  RE_ENDPOINT_ROOT = re.compile(r"\${([_a-z]+)}")
673
701
 
674
702
 
703
+ @dataclass(kw_only=True, frozen=True)
704
+ class _EndpointPathDetails:
705
+ root: str
706
+ root_path: str
707
+ resolved_path: str
708
+
709
+
710
+ def _resolve_endpoint_path(
711
+ path: str, api_endpoints: dict[str, str]
712
+ ) -> _EndpointPathDetails:
713
+ root_path_source = path.split("/")[0]
714
+ root_match = RE_ENDPOINT_ROOT.fullmatch(root_path_source)
715
+ if root_match is None:
716
+ raise Exception(f"invalid-api-path-root:{root_path_source}")
717
+
718
+ root_var = root_match.group(1)
719
+ root_path = api_endpoints[root_var]
720
+
721
+ _, *rest_path = path.split("/", 1)
722
+ resolved_path = "/".join([root_path] + rest_path)
723
+
724
+ return _EndpointPathDetails(
725
+ root=root_var, root_path=root_path, resolved_path=resolved_path
726
+ )
727
+
728
+
675
729
  class SpecEndpoint:
676
730
  method: RouteMethod
677
731
  root: str
@@ -680,9 +734,11 @@ class SpecEndpoint:
680
734
  path_basename: str
681
735
  data_loader: bool
682
736
  is_sdk: bool
737
+ is_beta: bool
683
738
  # Don't emit TypeScript endpoint code
684
739
  suppress_ts: bool
685
740
  function: Optional[str]
741
+ async_batch_path: str | None = None
686
742
  result_type: ResultType = ResultType.json
687
743
  has_attachment: bool = False
688
744
  desc: str | None = None
@@ -701,6 +757,8 @@ class SpecEndpoint:
701
757
  "path",
702
758
  "data_loader",
703
759
  "is_sdk",
760
+ "is_beta",
761
+ "async_batch_path",
704
762
  "function",
705
763
  "suppress_ts",
706
764
  "desc",
@@ -727,6 +785,15 @@ class SpecEndpoint:
727
785
  assert isinstance(is_sdk, bool)
728
786
  self.is_sdk = is_sdk
729
787
 
788
+ is_beta = data.get("is_beta", False)
789
+ assert isinstance(is_beta, bool)
790
+ self.is_beta = is_beta
791
+
792
+ async_batch_path = data.get("async_batch_path")
793
+ if async_batch_path is not None:
794
+ assert isinstance(async_batch_path, str)
795
+ self.async_batch_path = async_batch_path
796
+
730
797
  self.function = data.get("function")
731
798
 
732
799
  suppress_ts = data.get("suppress_ts", False)
@@ -735,14 +802,10 @@ class SpecEndpoint:
735
802
 
736
803
  self.result_type = ResultType(data.get("result_type", ResultType.json.value))
737
804
 
805
+ path_details = _resolve_endpoint_path(data["path"], builder.api_endpoints)
806
+ self.root = path_details.root
807
+ self.path_root = path_details.root_path
738
808
  self.desc = data.get("desc")
739
-
740
- root_match = RE_ENDPOINT_ROOT.fullmatch(path[0])
741
- if root_match is None:
742
- raise Exception(f"invalid-api-path-root:{path[0]}")
743
-
744
- self.root = root_match.group(1)
745
- self.path_root = builder.api_endpoints[self.root]
746
809
  # IMPROVE: remove need for is_external flag
747
810
  self.is_external = self.path_root == "api/external"
748
811
  self.has_attachment = data.get("has_attachment", False)
@@ -751,6 +814,10 @@ class SpecEndpoint:
751
814
  not is_sdk or self.desc is not None
752
815
  ), f"Endpoint description required for SDK endpoints, missing: {path}"
753
816
 
817
+ @property
818
+ def resolved_path(self: Self) -> str:
819
+ return f"{self.path_root}/{self.path_dirname}/{self.path_basename}"
820
+
754
821
 
755
822
  def _parse_const(
756
823
  builder: SpecBuilder,
@@ -1001,6 +1068,8 @@ class SpecBuilder:
1001
1068
  self.pending: list[NamespaceDataPair] = []
1002
1069
  self.parts: dict[str, dict[str, str]] = defaultdict(dict)
1003
1070
  self.preparts: dict[str, dict[str, str]] = defaultdict(dict)
1071
+ self.examples: dict[str, list[SpecEndpointExample]] = defaultdict(list)
1072
+ self.guides: dict[SpecGuideKey, list[SpecGuide]] = defaultdict(list)
1004
1073
  self.api_endpoints = api_endpoints
1005
1074
  base_namespace = SpecNamespace(name=base_namespace_name)
1006
1075
  for base_type in BaseTypeName:
@@ -1185,5 +1254,53 @@ class SpecBuilder:
1185
1254
  def add_prepart_file(self, target: str, name: str, data: str) -> None:
1186
1255
  self.preparts[target][name] = data
1187
1256
 
1257
+ def add_example_file(self, data: dict[str, object]) -> None:
1258
+ path_details = _resolve_endpoint_path(str(data["path"]), self.api_endpoints)
1259
+
1260
+ examples_data = data["examples"]
1261
+ if not isinstance(examples_data, list):
1262
+ raise Exception(
1263
+ f"'examples' in example files are expected to be a list, endpoint_path={path_details.resolved_path}"
1264
+ )
1265
+ for example in examples_data:
1266
+ arguments = example["arguments"]
1267
+ data_example = example["data"]
1268
+ if not isinstance(arguments, dict) or not isinstance(data_example, dict):
1269
+ raise Exception(
1270
+ f"'arguments' and 'data' fields must be dictionaries for each endpoint example, endpoint={path_details.resolved_path}"
1271
+ )
1272
+ self.examples[path_details.resolved_path].append(
1273
+ SpecEndpointExample(
1274
+ summary=str(example["summary"]),
1275
+ description=str(example["description"]),
1276
+ arguments=arguments,
1277
+ data=data_example,
1278
+ )
1279
+ )
1280
+
1281
+ def add_guide_file(self, file_content: str) -> None:
1282
+ import markdown
1283
+
1284
+ md = markdown.Markdown(extensions=["meta"])
1285
+ html = md.convert(file_content)
1286
+ meta: dict[str, list[str]] = md.Meta # type: ignore[attr-defined]
1287
+ title_meta: list[str] | None = meta.get("title")
1288
+ if title_meta is None:
1289
+ raise Exception("guides requier a title in the meta section")
1290
+
1291
+ path_meta: list[str] | None = meta.get("path")
1292
+ guide_key: SpecGuideKey = RootGuideKey()
1293
+ if path_meta is not None:
1294
+ path_details = _resolve_endpoint_path("".join(path_meta), self.api_endpoints)
1295
+ guide_key = EndpointGuideKey(path=path_details.resolved_path)
1296
+
1297
+ self.guides[guide_key].append(
1298
+ SpecGuide(
1299
+ title="".join(title_meta),
1300
+ html_content=html,
1301
+ markdown_content=file_content,
1302
+ )
1303
+ )
1304
+
1188
1305
  def resolve_proper_name(self, stype: SpecTypeDefn) -> str:
1189
1306
  return f"{'.'.join(stype.namespace.path)}.{stype.name}"
@@ -56,6 +56,7 @@ class PythonConfig(BaseLanguageConfig):
56
56
  emit_api_argument_lookup: bool = (
57
57
  False # emit a lookup for api endpoint path to argument type.
58
58
  )
59
+ emit_async_batch_processor: bool = False # emit the async batch wrapping functions
59
60
  emit_client_class: bool = False # emit the base class for the api client
60
61
  all_named_type_exports: bool = False # emit __all__ for all named type exports
61
62
  sdk_endpoints_only: bool = False # only emit is_sdk endpoints