UncountablePythonSDK 0.0.92__py3-none-any.whl → 0.0.93__py3-none-any.whl

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 (177) hide show
  1. {UncountablePythonSDK-0.0.92.dist-info → UncountablePythonSDK-0.0.93.dist-info}/METADATA +1 -1
  2. UncountablePythonSDK-0.0.93.dist-info/RECORD +301 -0
  3. pkgs/argument_parser/argument_parser.py +7 -7
  4. pkgs/filesystem_utils/_s3_session.py +2 -1
  5. pkgs/serialization/annotation.py +3 -3
  6. pkgs/serialization/missing_sentry.py +1 -1
  7. pkgs/serialization/serial_alias.py +2 -2
  8. pkgs/serialization/serial_class.py +1 -1
  9. pkgs/serialization/serial_generic.py +1 -1
  10. pkgs/serialization/serial_union.py +3 -3
  11. pkgs/serialization_util/serialization_helpers.py +1 -4
  12. pkgs/type_spec/actions_registry/__main__.py +0 -4
  13. pkgs/type_spec/builder.py +25 -21
  14. pkgs/type_spec/config.py +2 -5
  15. pkgs/type_spec/emit_open_api.py +1 -1
  16. pkgs/type_spec/emit_python.py +44 -28
  17. pkgs/type_spec/emit_typescript.py +13 -6
  18. pkgs/type_spec/parts/base.py.prepart +2 -0
  19. pkgs/type_spec/util.py +3 -5
  20. pkgs/type_spec/value_spec/__main__.py +15 -5
  21. pkgs/type_spec/value_spec/emit_python.py +5 -2
  22. pkgs/type_spec/value_spec/types.py +1 -1
  23. uncountable/core/client.py +3 -3
  24. uncountable/core/file_upload.py +5 -0
  25. uncountable/integration/job.py +2 -2
  26. uncountable/integration/queue_runner/command_server/types.py +1 -1
  27. uncountable/integration/server.py +4 -4
  28. uncountable/types/__init__.py +0 -1
  29. uncountable/types/api/batch/execute_batch.py +1 -2
  30. uncountable/types/api/batch/execute_batch_load_async.py +0 -1
  31. uncountable/types/api/chemical/convert_chemical_formats.py +0 -1
  32. uncountable/types/api/entity/create_entities.py +1 -2
  33. uncountable/types/api/entity/create_entity.py +2 -3
  34. uncountable/types/api/entity/get_entities_data.py +0 -1
  35. uncountable/types/api/entity/grant_entity_permissions.py +0 -1
  36. uncountable/types/api/entity/list_entities.py +3 -4
  37. uncountable/types/api/entity/lock_entity.py +0 -1
  38. uncountable/types/api/entity/resolve_entity_ids.py +2 -3
  39. uncountable/types/api/entity/set_entity_field_values.py +0 -1
  40. uncountable/types/api/entity/set_values.py +0 -1
  41. uncountable/types/api/entity/transition_entity_phase.py +1 -2
  42. uncountable/types/api/entity/unlock_entity.py +0 -1
  43. uncountable/types/api/equipment/associate_equipment_input.py +0 -1
  44. uncountable/types/api/field_options/upsert_field_options.py +0 -1
  45. uncountable/types/api/files/download_file.py +1 -2
  46. uncountable/types/api/id_source/list_id_source.py +3 -4
  47. uncountable/types/api/id_source/match_id_source.py +1 -2
  48. uncountable/types/api/input_groups/get_input_group_names.py +0 -1
  49. uncountable/types/api/inputs/create_inputs.py +2 -3
  50. uncountable/types/api/inputs/get_input_data.py +5 -6
  51. uncountable/types/api/inputs/get_input_names.py +3 -4
  52. uncountable/types/api/inputs/get_inputs_data.py +0 -1
  53. uncountable/types/api/inputs/set_input_attribute_values.py +0 -1
  54. uncountable/types/api/inputs/set_input_category.py +1 -2
  55. uncountable/types/api/inputs/set_input_subcategories.py +0 -1
  56. uncountable/types/api/inputs/set_intermediate_type.py +1 -2
  57. uncountable/types/api/material_families/update_entity_material_families.py +1 -2
  58. uncountable/types/api/outputs/get_output_data.py +2 -3
  59. uncountable/types/api/outputs/get_output_names.py +0 -1
  60. uncountable/types/api/outputs/resolve_output_conditions.py +0 -1
  61. uncountable/types/api/permissions/set_core_permissions.py +1 -2
  62. uncountable/types/api/project/get_projects.py +3 -4
  63. uncountable/types/api/project/get_projects_data.py +4 -5
  64. uncountable/types/api/recipe_links/create_recipe_link.py +1 -2
  65. uncountable/types/api/recipe_links/remove_recipe_link.py +1 -2
  66. uncountable/types/api/recipe_metadata/get_recipe_metadata_data.py +3 -4
  67. uncountable/types/api/recipes/add_recipe_to_project.py +0 -1
  68. uncountable/types/api/recipes/archive_recipes.py +0 -1
  69. uncountable/types/api/recipes/associate_recipe_as_input.py +0 -1
  70. uncountable/types/api/recipes/associate_recipe_as_lot.py +0 -1
  71. uncountable/types/api/recipes/clear_recipe_outputs.py +0 -1
  72. uncountable/types/api/recipes/create_recipe.py +1 -2
  73. uncountable/types/api/recipes/create_recipes.py +1 -2
  74. uncountable/types/api/recipes/disassociate_recipe_as_input.py +0 -1
  75. uncountable/types/api/recipes/edit_recipe_inputs.py +3 -4
  76. uncountable/types/api/recipes/get_column_calculation_values.py +0 -1
  77. uncountable/types/api/recipes/get_curve.py +0 -1
  78. uncountable/types/api/recipes/get_recipe_calculations.py +0 -1
  79. uncountable/types/api/recipes/get_recipe_links.py +1 -2
  80. uncountable/types/api/recipes/get_recipe_names.py +0 -1
  81. uncountable/types/api/recipes/get_recipe_output_metadata.py +0 -1
  82. uncountable/types/api/recipes/get_recipes_data.py +13 -14
  83. uncountable/types/api/recipes/lock_recipes.py +1 -2
  84. uncountable/types/api/recipes/remove_recipe_from_project.py +0 -1
  85. uncountable/types/api/recipes/set_recipe_inputs.py +1 -2
  86. uncountable/types/api/recipes/set_recipe_metadata.py +0 -1
  87. uncountable/types/api/recipes/set_recipe_output_annotations.py +2 -3
  88. uncountable/types/api/recipes/set_recipe_output_file.py +0 -1
  89. uncountable/types/api/recipes/set_recipe_outputs.py +3 -4
  90. uncountable/types/api/recipes/set_recipe_tags.py +2 -3
  91. uncountable/types/api/recipes/unarchive_recipes.py +0 -1
  92. uncountable/types/api/recipes/unlock_recipes.py +1 -2
  93. uncountable/types/api/triggers/run_trigger.py +0 -1
  94. uncountable/types/api/uploader/invoke_uploader.py +0 -1
  95. uncountable/types/async_batch.py +0 -1
  96. uncountable/types/async_batch_processor.py +1 -2
  97. uncountable/types/async_batch_t.py +1 -2
  98. uncountable/types/async_jobs.py +0 -1
  99. uncountable/types/async_jobs_t.py +1 -2
  100. uncountable/types/auth_retrieval.py +0 -1
  101. uncountable/types/auth_retrieval_t.py +2 -3
  102. uncountable/types/base.py +0 -1
  103. uncountable/types/base_t.py +2 -1
  104. uncountable/types/calculations.py +0 -1
  105. uncountable/types/calculations_t.py +0 -1
  106. uncountable/types/chemical_structure.py +0 -1
  107. uncountable/types/chemical_structure_t.py +0 -1
  108. uncountable/types/client_base.py +29 -30
  109. uncountable/types/client_config.py +0 -1
  110. uncountable/types/client_config_t.py +1 -2
  111. uncountable/types/curves.py +0 -1
  112. uncountable/types/curves_t.py +2 -3
  113. uncountable/types/entity.py +0 -1
  114. uncountable/types/entity_t.py +3 -4
  115. uncountable/types/experiment_groups.py +0 -1
  116. uncountable/types/experiment_groups_t.py +0 -1
  117. uncountable/types/field_values.py +0 -1
  118. uncountable/types/field_values_t.py +6 -7
  119. uncountable/types/fields.py +0 -1
  120. uncountable/types/fields_t.py +0 -1
  121. uncountable/types/generic_upload.py +0 -1
  122. uncountable/types/generic_upload_t.py +2 -3
  123. uncountable/types/id_source.py +0 -1
  124. uncountable/types/id_source_t.py +1 -2
  125. uncountable/types/identifier.py +0 -1
  126. uncountable/types/identifier_t.py +1 -2
  127. uncountable/types/input_attributes.py +0 -1
  128. uncountable/types/input_attributes_t.py +0 -1
  129. uncountable/types/inputs.py +0 -1
  130. uncountable/types/inputs_t.py +2 -3
  131. uncountable/types/integration_server.py +0 -1
  132. uncountable/types/integration_server_t.py +1 -2
  133. uncountable/types/job_definition.py +0 -1
  134. uncountable/types/job_definition_t.py +5 -6
  135. uncountable/types/outputs.py +0 -1
  136. uncountable/types/outputs_t.py +1 -2
  137. uncountable/types/overrides.py +0 -1
  138. uncountable/types/overrides_t.py +0 -1
  139. uncountable/types/permissions.py +0 -1
  140. uncountable/types/permissions_t.py +1 -2
  141. uncountable/types/phases.py +0 -1
  142. uncountable/types/phases_t.py +0 -1
  143. uncountable/types/post_base.py +0 -1
  144. uncountable/types/post_base_t.py +1 -2
  145. uncountable/types/queued_job.py +0 -1
  146. uncountable/types/queued_job_t.py +2 -3
  147. uncountable/types/recipe_identifiers.py +0 -1
  148. uncountable/types/recipe_identifiers_t.py +1 -2
  149. uncountable/types/recipe_inputs.py +0 -1
  150. uncountable/types/recipe_inputs_t.py +1 -2
  151. uncountable/types/recipe_links.py +0 -1
  152. uncountable/types/recipe_links_t.py +2 -3
  153. uncountable/types/recipe_metadata.py +0 -1
  154. uncountable/types/recipe_metadata_t.py +0 -1
  155. uncountable/types/recipe_output_metadata.py +0 -1
  156. uncountable/types/recipe_output_metadata_t.py +0 -1
  157. uncountable/types/recipe_tags.py +0 -1
  158. uncountable/types/recipe_tags_t.py +0 -1
  159. uncountable/types/recipe_workflow_steps.py +0 -1
  160. uncountable/types/recipe_workflow_steps_t.py +2 -3
  161. uncountable/types/recipes.py +0 -1
  162. uncountable/types/recipes_t.py +0 -1
  163. uncountable/types/response.py +0 -1
  164. uncountable/types/response_t.py +0 -1
  165. uncountable/types/secret_retrieval.py +0 -1
  166. uncountable/types/secret_retrieval_t.py +2 -3
  167. uncountable/types/units.py +0 -1
  168. uncountable/types/units_t.py +0 -1
  169. uncountable/types/users.py +0 -1
  170. uncountable/types/users_t.py +0 -1
  171. uncountable/types/webhook_job.py +0 -1
  172. uncountable/types/webhook_job_t.py +0 -1
  173. uncountable/types/workflows.py +0 -1
  174. uncountable/types/workflows_t.py +1 -2
  175. UncountablePythonSDK-0.0.92.dist-info/RECORD +0 -301
  176. {UncountablePythonSDK-0.0.92.dist-info → UncountablePythonSDK-0.0.93.dist-info}/WHEEL +0 -0
  177. {UncountablePythonSDK-0.0.92.dist-info → UncountablePythonSDK-0.0.93.dist-info}/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: UncountablePythonSDK
3
- Version: 0.0.92
3
+ Version: 0.0.93
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
@@ -0,0 +1,301 @@
1
+ docs/.gitignore,sha256=_ebkZUcwfvfnGEJ95rfj1lxoBNd6EE9ZvtOc7FsbfFE,7
2
+ docs/conf.py,sha256=YF5J-9g_Wg8wXmyHsGaE8xYlDEzqocNl3UWUmP0CwBg,1702
3
+ docs/index.md,sha256=eEdirX_Ds6ICTRtIS5iT4irCquHcQyKN7E4M5QP9T8A,257
4
+ docs/justfile,sha256=cvNcpb-ByPOF2aCrFlg3DDZBoYMx5W8xGdr13m9HcnI,215
5
+ docs/quickstart.md,sha256=3GuJ0MB1O5kjlsrgAmdSkDq0rYqATrYy-tzEHDy8H-c,422
6
+ docs/requirements.txt,sha256=-sWMwUL2L6vU1QzoQAS-aP8oPbUqXDfMxCeeTKnShFc,138
7
+ docs/static/logo_blue.png,sha256=SyYpMTVhhBbhF5Wl8lWaVwz-_p1MIR6dW6bVhufQRME,46708
8
+ docs/static/favicons/android-chrome-192x192.png,sha256=XoF-AhD55JlSBDGsEPJKfT_VeXT-awhwKyZnxLhrwvk,1369
9
+ docs/static/favicons/android-chrome-512x512.png,sha256=1S4xwY9YtJQ5ifFsZ-DOzssoyBYs0t9uwdOUmYx0Xso,3888
10
+ docs/static/favicons/apple-touch-icon.png,sha256=4qdKI-pFHxrot00cFGY-_jD7Kame6Ct_klQBNmW3j80,1403
11
+ docs/static/favicons/browserconfig.xml,sha256=oU7ZjY1qKLU992MIOAOZ7h-uVyqmEah2TKzyae4Uw0s,263
12
+ docs/static/favicons/favicon-16x16.png,sha256=M4r4A3_NVuw3h5pWZs5-CmhmquSMiKaNcCqyyJRjNmU,392
13
+ docs/static/favicons/favicon-32x32.png,sha256=U4UU652zGnSeU3P9kUqxPeEnVf6zhtdNdNwGz1E40UU,511
14
+ docs/static/favicons/manifest.json,sha256=6q_3nZkcg_x0xut4eE-xpdeMY1TydwiZIcbXlLAq9X8,437
15
+ docs/static/favicons/mstile-150x150.png,sha256=eAK4QdEofhdLtfmjuPTpnX3MJqYnvGXsHYUjlcQekyY,1035
16
+ docs/static/favicons/safari-pinned-tab.svg,sha256=S84fRnz0ZxLnQrKtmmFZytiRyu1xLtMR_RVy5jmwU7k,1926
17
+ examples/async_batch.py,sha256=tEyvgxk2uf681mKlN4TDuPMkb1OHyM9oO8pYW4A7HvM,1142
18
+ examples/create_entity.py,sha256=t6WBZsWRDbWZgFCWXKGgKL5LAB6-38oaiNYGxMAa2No,686
19
+ examples/download_files.py,sha256=rjv7EUgSw_W24_F5La-MljnIDQhbrvA7p2M-qPFbrXA,734
20
+ examples/edit_recipe_inputs.py,sha256=mtk_oSkN-OT2hKkb1XKXrRiUaGYTJstXuOKyTR51Fjo,1663
21
+ examples/invoke_uploader.py,sha256=rEvmVY5TjigN_-4PTQdkjY-bC5DrYMcJgquyZ4Tt5FM,748
22
+ examples/set_recipe_metadata_file.py,sha256=cRVXGz4UN4aqnNrNSzyBmikYHpe63lMIuzOpMwD9EDU,1036
23
+ examples/set_recipe_output_file_sdk.py,sha256=Lz1amqppnWTX83z-C090wCJ4hcKmCD3kb-4v0uBRi0Y,782
24
+ examples/upload_files.py,sha256=qMaSvMSdTMPOOP55y1AwEurc0SOdZAMvEydlqJPsGpg,432
25
+ examples/integration-server/pyproject.toml,sha256=ziyEbSiTYlOk784euVJjuZ3UqIEENkPXuug5VTrkjms,9131
26
+ examples/integration-server/jobs/materials_auto/example_cron.py,sha256=7VVQ-UJsq3DbGpN3XPnorRVZYo-vCwbfSU3VVDluIzA,699
27
+ examples/integration-server/jobs/materials_auto/example_wh.py,sha256=Hx5nonavOh2L3JykDpI5bPqPu8L1wwhwekTUfTRgq9g,479
28
+ examples/integration-server/jobs/materials_auto/profile.yaml,sha256=XlOXSRplMJ13T6900pv1wDKxeE9V1hZZTMuvup1MiBM,896
29
+ pkgs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
30
+ pkgs/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
31
+ pkgs/argument_parser/__init__.py,sha256=AOL6yZkJg9Z8Q4v4JY4agEbMDQWPptVauSA_itShv64,693
32
+ pkgs/argument_parser/_is_enum.py,sha256=Gw6jJa8nBwYGqXwwCZbSnWL8Rvr5alkg5lSVAqXtOZM,257
33
+ pkgs/argument_parser/_is_namedtuple.py,sha256=Rjc1bKanIPPogl3qG5JPBxglG1TqWYOo1nxxhBASQWY,265
34
+ pkgs/argument_parser/argument_parser.py,sha256=_W0-HLC1F8jXgeFJnhUREorqcXzuhZi__eX_7FFkkVs,19363
35
+ pkgs/argument_parser/case_convert.py,sha256=NuJLJUJRbyVb6_Slen4uqaStEHbcOS1d-hBBfDrrw-c,605
36
+ pkgs/filesystem_utils/__init__.py,sha256=2a0d2rEPlEEYwhm3Wckny4VCp4ZS7JtYSXmwdwNCRjo,1332
37
+ pkgs/filesystem_utils/_blob_session.py,sha256=CtoB7PIocuZo8vvFIS_Rc-YR6KwzFB0rHUVPKFEbRAI,4862
38
+ pkgs/filesystem_utils/_gdrive_session.py,sha256=XTAKppTfIiJtPkzq90yftoMHa-kcGe9MDZQlmx1bviQ,11058
39
+ pkgs/filesystem_utils/_local_session.py,sha256=xFEYhAvNqrOYqwt4jrEYOuYkjJn0zclZhTelW_Q1-rw,2325
40
+ pkgs/filesystem_utils/_s3_session.py,sha256=DdD6M90z1VyTiuRdTmjvBNJOEFHBPyEU8wGKRKwHvOU,4027
41
+ pkgs/filesystem_utils/_sftp_session.py,sha256=6qwBGYu8UTFYw9YAmYAD0qL9qtivRRQpvzmlInmJZ_k,4709
42
+ pkgs/filesystem_utils/file_type_utils.py,sha256=oklu7Wtcxg9pBz84cAlXpNlhYEM0AbsO5DoEqvFjoXY,1896
43
+ pkgs/filesystem_utils/filesystem_session.py,sha256=BQ2Go8Mu9-GcnaWh2Pm4x7ugLVsres6XrOQ8RoiEpcE,1045
44
+ pkgs/serialization/__init__.py,sha256=b2sNfYICz0D6Y8shzEUfyUoHZukfuAvfuaZvg8dZHic,1163
45
+ pkgs/serialization/annotation.py,sha256=wn9yb4a4DrsyPAYqY9mVswJarP4lsOkgfnvchrg5toE,2104
46
+ pkgs/serialization/missing_sentry.py,sha256=89SomyM0sBWLr_N0SPOyxU3hWcm1ljL-veTazZ1-GU8,811
47
+ pkgs/serialization/opaque_key.py,sha256=8ak7aMCGWkKDjnG374yqy8gtnCCUzG2DSJEBfoPgi0c,194
48
+ pkgs/serialization/serial_alias.py,sha256=zP0wAy7NGvpyOe-TGUwHy3wPF0XZTIwFLh_caDX67BU,1343
49
+ pkgs/serialization/serial_class.py,sha256=hL5SVL4MqSzeTXSLL15fvDQtk32z0NywsKBWUL9b-k0,6100
50
+ pkgs/serialization/serial_generic.py,sha256=vAC0-o9fkco2lM_YvBavY0JDYncDxbW3jFboYeHRImw,461
51
+ pkgs/serialization/serial_union.py,sha256=IdWsSsM8j-qGfl5Wv6haX37ZS1SKob8XT8cilBBOVIo,2670
52
+ pkgs/serialization/yaml.py,sha256=yoJtu7_ixnJV6uTxA_U1PpK5F_ixT08AKVh5ocyYwXM,1466
53
+ pkgs/serialization_util/__init__.py,sha256=YykkhqGNKiLCo-D5vSTq6WiPNfCyPXyr-mQO5e5Klak,513
54
+ pkgs/serialization_util/_get_type_for_serialization.py,sha256=dW5_W9MFd6wgWfW5qlWork-GBb-QFLtiOZkjk2Zqn2M,1177
55
+ pkgs/serialization_util/convert_to_snakecase.py,sha256=H2BAo5ZdcCDN77RpLb-uP0s7-FQ5Ukwnsd3VYc1vD0M,583
56
+ pkgs/serialization_util/dataclasses.py,sha256=uhNGXQPQLZblDFQuuwkAGmKOPiRyfDzCdg72CVtYJGA,390
57
+ pkgs/serialization_util/serialization_helpers.py,sha256=d11gYBe0WDlPDMqi8LatD4I5RluIcheD8xtMXnPLF1g,6537
58
+ pkgs/strenum_compat/__init__.py,sha256=wXRFeNvBm8RU6dy1PFJ5sRLgUIEeH_DVR95Sv5qpGbk,59
59
+ pkgs/strenum_compat/strenum_compat.py,sha256=uOUAgpYTjHs1MX8dG81jRlyTkt3KNbkV_25zp7xTX2s,36
60
+ pkgs/type_spec/__init__.py,sha256=h5DmJTca4QVV10sZR1x0-MlkZfuGYDfapR3zHvXfzto,19
61
+ pkgs/type_spec/__main__.py,sha256=5bJaX9Y_-FavP0qwzhk-z-V97UY7uaezJTa1zhO_HHQ,1048
62
+ pkgs/type_spec/builder.py,sha256=eXvfY3TaxF4zdSvoshVQC_q_ZA0S0x6-caJ4M_5oY7M,52731
63
+ pkgs/type_spec/config.py,sha256=K-DFjRVIW5RCJOuB0QhkWZMOrsIZavFURqmhgAoULgw,5103
64
+ pkgs/type_spec/emit_io_ts.py,sha256=CUvBs0boB_X-Kndh66yYcqFfq3oC_LGs8YffLkJ0ZXA,5707
65
+ pkgs/type_spec/emit_open_api.py,sha256=9AgtHB3ZIObs9cV-RqNZt_q1icmIGwPeovQ63gTl-l8,24541
66
+ pkgs/type_spec/emit_open_api_util.py,sha256=34zslFjTiOI5q8YreBOLD-afmaW4lrlK7pBpNAd3CxA,2379
67
+ pkgs/type_spec/emit_python.py,sha256=BohmwGN89EDHiNlT6-z7xv2C0vIRhQ2SXr4kdoue2a4,52103
68
+ pkgs/type_spec/emit_typescript.py,sha256=_7-SLAOP0jMIrDWDKCPJpyykJh3n0hynm5b-Ltq23hM,10620
69
+ pkgs/type_spec/emit_typescript_util.py,sha256=sugxboeMwXiIdk4RDyUR_CxU31Le3OQ7i5HmuHeSLvc,10447
70
+ pkgs/type_spec/load_types.py,sha256=ero3SXB0M7xKHni5Qxop5Yh5A1TYjjoqwkEgUCQx71Q,3657
71
+ pkgs/type_spec/open_api_util.py,sha256=OiuMWUIwi7ibIOABtuHnhrPdfd3rVxv0MJ1ZY1xj_qw,7083
72
+ pkgs/type_spec/test.py,sha256=4ueujBq-pEgnX3Z69HyPmD-bullFXmpixcpVzfOkhP4,489
73
+ pkgs/type_spec/util.py,sha256=TPmFVgiGj6niurg4V-AKFkQQDDDtJ8a5o2Z_EDgMTvU,4827
74
+ pkgs/type_spec/actions_registry/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
75
+ pkgs/type_spec/actions_registry/__main__.py,sha256=SRw6kIhHTW7W2wGijYq66JARzoc4KpPmbLqwvnETyTE,4277
76
+ pkgs/type_spec/actions_registry/emit_typescript.py,sha256=W1lI36ITdJ7MBf37wlTB7H3X9Ljt217vIGMv4e3fxfY,5986
77
+ pkgs/type_spec/parts/base.py.prepart,sha256=RDNNo4nbLiC9ASIODq2xIt0HkwDNiJVcmjDD33Bubaw,2303
78
+ pkgs/type_spec/parts/base.ts.prepart,sha256=2FJJvpg2olCcavxj0nbYWdwKl6KeScour2JjSvN42l8,1001
79
+ pkgs/type_spec/type_info/__main__.py,sha256=pmVjVqXyVh8vKTNCTFgz80Sg74C5BKToP3E6GS-X_So,857
80
+ pkgs/type_spec/type_info/emit_type_info.py,sha256=mQSxG-UTFl0i8ylvXEvpk1d9NIMYsx39Le7-i5JVuN0,13520
81
+ pkgs/type_spec/value_spec/__init__.py,sha256=Z-grlcZtxAfEXhPHsK0nD7PFLGsv4eqvunaPN7_TA84,83
82
+ pkgs/type_spec/value_spec/__main__.py,sha256=hCTdANTgCNTdZVcXeUd8axENrKNb_oVNrmrygjQht48,8663
83
+ pkgs/type_spec/value_spec/convert_type.py,sha256=X5N7DOTo5XOIHbcYHh9RZFthzb2gcnYg2tRuVMBhbxY,2517
84
+ pkgs/type_spec/value_spec/emit_python.py,sha256=lWO4PFcXo0jgkQy6ZAVN4QJ1jdNXXzkS3oxWCtycQ4k,7131
85
+ pkgs/type_spec/value_spec/types.py,sha256=Yc3LaKHN1G6wbgrBv0dpu5vijUXtS2GcDTusYPnDvK0,454
86
+ uncountable/__init__.py,sha256=8l8XWNCKsu7TG94c-xa2KHpDegvxDC2FyQISdWC763Y,89
87
+ uncountable/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
88
+ uncountable/core/__init__.py,sha256=RFv0kO6rKFf1PtBPu83hCGmxqkJamRtsgQ9_-ztw7tA,341
89
+ uncountable/core/async_batch.py,sha256=9pYGFzVCQXt8059qFHgutweGIFPquJ5Xfq6NT5P-1K0,1206
90
+ uncountable/core/client.py,sha256=cypErG4AXAcgkzetvlSLWA75-LKjqreobZgjSfSUKbY,13004
91
+ uncountable/core/environment.py,sha256=6cc-nUvUIbJMI0OSEg3dWI-iNgSYhCdUKKn607Z3QpM,1040
92
+ uncountable/core/file_upload.py,sha256=bgvXk9vfF5qlhy2NAUcEEG7Q7i-c1wr2HrpaWD7HldU,4516
93
+ uncountable/core/types.py,sha256=s2CjqYJpsmbC7xMwxxT7kJ_V9bwokrjjWVVjpMcQpKI,333
94
+ uncountable/integration/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
95
+ uncountable/integration/cli.py,sha256=h3RE0l1SdjkveOKeY2amlmrJppK4HEQJXk8VG9UJRWg,1359
96
+ uncountable/integration/construct_client.py,sha256=I53mGcdS88hba3HFwgXmWQaTd1d5u0jWNSwyc_vlVsQ,1937
97
+ uncountable/integration/cron.py,sha256=6eH-kIs3sdYPCyb62_L2M7U_uQTdMTdwY5hreEJb0hw,887
98
+ uncountable/integration/entrypoint.py,sha256=BHOYPQgKvZE6HG8Rv15MkdYl8lRkvfDgv1OdLo0oQ9Q,433
99
+ uncountable/integration/job.py,sha256=zamfyEhtZh0cWyd8DvVq64RlaA1aX_wtOALv6Kf7tyo,2354
100
+ uncountable/integration/scan_profiles.py,sha256=760zbv7O7wXxHUHqUkFBpd1Afe8hqxMPU3ugwZGdhEo,2925
101
+ uncountable/integration/scheduler.py,sha256=jrtktQYGW4QKRLH5GvhOFvCl4S9CLLhWY2GF0rzY-KM,4780
102
+ uncountable/integration/server.py,sha256=m_DYRosGbHuPhygM32Xo-jRBl_oaUhOYsBBD1qwwKh4,4697
103
+ uncountable/integration/telemetry.py,sha256=QFvvJdzc15CvdaRLFaJeru0OouAFbYdhHYYovbT8bXg,7425
104
+ uncountable/integration/db/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
105
+ uncountable/integration/db/connect.py,sha256=mE3bdV0huclH2iT_dXCQdRL4LkjIuf_myAR64RTWXEs,498
106
+ uncountable/integration/db/session.py,sha256=96cGQXpe6IugBTdSsjdP0S5yhJ6toSmbVB6qhc3FJzE,693
107
+ uncountable/integration/executors/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
108
+ uncountable/integration/executors/executors.py,sha256=Kzisp1eKufGCWrHIw4mmAj-l1UQ2oJsJR7I-_mksnVs,5441
109
+ uncountable/integration/executors/generic_upload_executor.py,sha256=OnVY4KfmAgaf9LPSAgj7H2wFRXwNXBpg7egVy85z5lk,10327
110
+ uncountable/integration/executors/script_executor.py,sha256=BBQ9f0l7uH2hgKf60jtm-pONzwk-EeOhM2qBAbv_URo,846
111
+ uncountable/integration/queue_runner/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
112
+ uncountable/integration/queue_runner/job_scheduler.py,sha256=2acmeWscG87MZsifxwMRMGJ4sQgQVNJNr5CqIPUg75E,6288
113
+ uncountable/integration/queue_runner/queue_runner.py,sha256=0BmYu5zHdothTevGsB-nXg6MBd1UD-WkP3h1WCKMdQg,710
114
+ uncountable/integration/queue_runner/types.py,sha256=8qTq29BTSa5rmW6CBlBntP0pNIiDcwu1wHa78pjroS0,219
115
+ uncountable/integration/queue_runner/worker.py,sha256=WwJmwHkgovfiqrMeNJVtIyDYJAib5ajog5ag2l_AquI,4584
116
+ uncountable/integration/queue_runner/command_server/__init__.py,sha256=gQPVILGpWzCr2i5GJyoqna7AOSFvtn4tav69gB78mTQ,571
117
+ uncountable/integration/queue_runner/command_server/command_client.py,sha256=DJb0TUVFkiiLBEQzHSN94sTRnuEbutNEgdN39XmnOXI,2046
118
+ uncountable/integration/queue_runner/command_server/command_server.py,sha256=yyXryhiEC2eGS0yFElLGsVzSKwOuYvj-zp22jQorkv0,2138
119
+ uncountable/integration/queue_runner/command_server/types.py,sha256=PGq6EAGPC_nppXQKp9alAjuBQx1h87BefiMa0XU--PY,975
120
+ uncountable/integration/queue_runner/command_server/protocol/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
121
+ uncountable/integration/queue_runner/command_server/protocol/command_server.proto,sha256=pf7FAT2eGuao0VYCFrgTAsM-tiPi1Bhz19XN5So1WFk,439
122
+ uncountable/integration/queue_runner/command_server/protocol/command_server_pb2.py,sha256=-lBTc5Tz48agqNSeOSpBE69e2kRmWF59sUaowCl8p7U,2207
123
+ uncountable/integration/queue_runner/command_server/protocol/command_server_pb2.pyi,sha256=9viBn6PHvtfMSRwam57ke5O2D_k8LapWYVfBRjknIYg,1281
124
+ uncountable/integration/queue_runner/command_server/protocol/command_server_pb2_grpc.py,sha256=ZVHkuLDjEbXMCxBsw1UrRhT3EEF8CDDqEvmE3Kbp1H4,5359
125
+ uncountable/integration/queue_runner/datastore/__init__.py,sha256=6BefApqN8D2zlVOH14QAeVzwQ8j5NIb41-njT02Za0k,88
126
+ uncountable/integration/queue_runner/datastore/datastore_sqlite.py,sha256=UZQABTrM3HxVaojCnI1pTU3v1GsbE3G-OCgXP5ekcxI,3801
127
+ uncountable/integration/queue_runner/datastore/interface.py,sha256=j4D-zVvLq-48VTVwHVei82UVUJ_P3cxiseyiTl0MoNw,534
128
+ uncountable/integration/queue_runner/datastore/model.py,sha256=8-RI5A2yPZVGBLWINVmMd6VOl_oHtqGtnaNXcapAChw,577
129
+ uncountable/integration/secret_retrieval/__init__.py,sha256=3QXVj35w8rRMxVvmmsViFYDi3lcb3g70incfalOEm6o,87
130
+ uncountable/integration/secret_retrieval/retrieve_secret.py,sha256=9iz9N8Z-B68QwFCXsx8hTYbgDbk06ejkJ3RQ9mCLMyM,3000
131
+ uncountable/integration/webhook_server/entrypoint.py,sha256=yQWQq_k3kbJkSsEEt6k22YwhXekezJZfV0rnn-hP-Yo,5516
132
+ uncountable/types/__init__.py,sha256=BEYks35yh8J3pp-BI5-CyIUrH96IQ7myliD-zOhbyao,9196
133
+ uncountable/types/async_batch.py,sha256=yCCWrrLQfxXVqZp-KskxLBNkNmuELdz4PJjx8ULppgs,662
134
+ uncountable/types/async_batch_processor.py,sha256=ETgkfb-DLmI4bZwsgS6Awbm_zEXyjbtW5TZVpIIGN_0,14170
135
+ uncountable/types/async_batch_t.py,sha256=zJF7BsrVEquPPg7z28clkLXo6_cGFBwHriCmJ3y7eEw,3001
136
+ uncountable/types/async_jobs.py,sha256=JI0ScfawaqMRbJ2jbgW3YQLhijPnBeYdMnZJjygSxHg,322
137
+ uncountable/types/async_jobs_t.py,sha256=u4xd3i512PZ-9592Q2ZgWh_faMiI4UMm0F_gOmZnerI,1389
138
+ uncountable/types/auth_retrieval.py,sha256=770zjN1K9EF5zs1Xml7x6ke6Hkze7rcMT5FdDVCIl9M,549
139
+ uncountable/types/auth_retrieval_t.py,sha256=PFjSoRupf2wGAz1SonuNyf8CVW9nVeaiHLFOPMZkQxw,2172
140
+ uncountable/types/base.py,sha256=10-34wiyxrOZr2RQNiBohDNWc7b2i_La_yMuKLYslcU,338
141
+ uncountable/types/base_t.py,sha256=9Hrcs0Op6xrJCmhfyzUqKsJmt1WBZMa0K9cuSiPDKfg,2822
142
+ uncountable/types/calculations.py,sha256=fApOFpgBemt_t7IVneVR0VdI3X5EOxiG6Xhzr6RR8Gw,263
143
+ uncountable/types/calculations_t.py,sha256=LE_HWYPf7yxNTpH5sVPaC0e98OxJ5hUOhHezeJNKDtk,648
144
+ uncountable/types/chemical_structure.py,sha256=ujyragaD26-QG5jgKnWhO7TN3N1V9b_04T2WhqNYxxo,281
145
+ uncountable/types/chemical_structure_t.py,sha256=iYmGER_vXqoksv2Nr189qU1Zm70s-U49Eiv0DkWaB1I,773
146
+ uncountable/types/client_base.py,sha256=h5nOrnuw6Szq-fEu9mxzMhqMlm3HDpoi5PlL9Or8ypk,68699
147
+ uncountable/types/client_config.py,sha256=qLpHt4O_B098CyN6qQajoxZ2zjZ1DILXLUEGyyGP0TQ,280
148
+ uncountable/types/client_config_t.py,sha256=k_UkjemqiVuJBiFUjJYk3h673Nahr0nGZvfEZFzsC0k,699
149
+ uncountable/types/curves.py,sha256=QyEyC20jsG-LGKVx6miiF-w70vKMwNkILFBDIJ5Ok9g,345
150
+ uncountable/types/curves_t.py,sha256=2_9qdrSl1XAvIG57lo45KWNpa0wXgZ97OkSRCPRrudc,1347
151
+ uncountable/types/entity.py,sha256=Zclk1LYcRaYrMDhqyCjMSLEg0fE6_q8LHvV22Qvscgs,566
152
+ uncountable/types/entity_t.py,sha256=dTf525ZlAnhWwuCPElR5xooLt0q0LtdtTMkgMQv15nM,17422
153
+ uncountable/types/experiment_groups.py,sha256=qUpFOx1AKgzaT_4khCOv5Xs6jwiQGbvHH-GUh3v1nv4,288
154
+ uncountable/types/experiment_groups_t.py,sha256=_fAYZwqYLR3cFdv2vwLOYs5TvH5CEWDEbh3kFpg26zY,700
155
+ uncountable/types/field_values.py,sha256=hERqHIDmWPQpdW7BLitdA-DNiutmll-ggecwEO7FoVU,1181
156
+ uncountable/types/field_values_t.py,sha256=2BFTqfmlf1tvTFfY5I8xMIBd0IX-EupnzOtwFYFklQs,5751
157
+ uncountable/types/fields.py,sha256=M0_ZZr0QdNLXkdHAGo5mfU90kEtHedCSKrcod-FG30Y,245
158
+ uncountable/types/fields_t.py,sha256=Ze-X83HyM7q4oMk5LLRfPqvRojyAx6dDqIUPX70gNYc,644
159
+ uncountable/types/generic_upload.py,sha256=bNep2nT0fbKAlJaGvHWPmuvfX5KtS8kgTqTh8FQk1NA,858
160
+ uncountable/types/generic_upload_t.py,sha256=z7rxOu8SEyOmIlz06AAXmRkbQdBEpZigb8N2eGi6XIY,3756
161
+ uncountable/types/id_source.py,sha256=sBlDfUwHQ7bGWMschSD_aPQL7LVnCPiV2RAlPLXrAqk,546
162
+ uncountable/types/id_source_t.py,sha256=XzxQWkD0iQoq6LxtpCVWylYtOvq5dXslu_2ML1xNP_U,1838
163
+ uncountable/types/identifier.py,sha256=J-ptCFE0_R0bBAvrYp-gvHk8H9Qq9rhbmeyXgwb9nos,482
164
+ uncountable/types/identifier_t.py,sha256=b0V4_vQYWrsCnCJgNlR1FlHQGsGmGgrqREB5IhKsOec,1787
165
+ uncountable/types/input_attributes.py,sha256=T4qGyuZAgcdkaWeS0T7PFKQN44GEdAvVBBsaEkaCmdA,283
166
+ uncountable/types/input_attributes_t.py,sha256=3m5Bbs5Hj6jX425T0hmqUkjxfDTjhDgMgvKsE2vPBlA,843
167
+ uncountable/types/inputs.py,sha256=3ghg39_oiLF5HqWF_wNwYv4HMR1lrKLfeRLn5ptIGw4,446
168
+ uncountable/types/inputs_t.py,sha256=0b3U77JcZT4hgUvbP_i-E5RoJbJnRxn3OKBqGWu32TM,2097
169
+ uncountable/types/integration_server.py,sha256=VonA8h8TGnVBiss5W8-K82lA01JQa7TLk0ubFo8iiBQ,364
170
+ uncountable/types/integration_server_t.py,sha256=37zyqeet54P9m6pxaZfLOgZCqqZA2dxJ5gl6NCoelQ0,1188
171
+ uncountable/types/job_definition.py,sha256=6BkLZrmTfIYh45XFGZ5HOYveued0YXvl17YTlXblXjw,1646
172
+ uncountable/types/job_definition_t.py,sha256=n8lwjNtt6eHg01yARRIgDiLO9W8ev5upb3qs2RPHZXg,7753
173
+ uncountable/types/outputs.py,sha256=I6zP2WHXg_jXgMqmuEJuJOlsjKjQGHjfs1JOwW9YxBM,260
174
+ uncountable/types/outputs_t.py,sha256=ZJhKKkksJ-K7iuuumCly9edU8TRv-eWol4PKG7XPo3E,734
175
+ uncountable/types/overrides.py,sha256=fOvj8P9K9ul8fnTwA--l140EWHuc1BFq8tXgtBkYld4,410
176
+ uncountable/types/overrides_t.py,sha256=WNKKHrZcO6ZzeZfEXEW0xCsGWjbmHeUddT-4qp81Y8o,1303
177
+ uncountable/types/permissions.py,sha256=F24reVRd-J3iRSif8BwMNUcDwxRluBrTre3mJ36HP90,276
178
+ uncountable/types/permissions_t.py,sha256=hmAUZryOdnkZS0BeFViH-6fJ4rVPtwJaZ1JLlL_aGl4,1589
179
+ uncountable/types/phases.py,sha256=Capx0Tbx52151tHWw8tdOT_NMKMOyHZhrNuGrhuBzfo,245
180
+ uncountable/types/phases_t.py,sha256=L4HsYZHw_PR79eBbMwluN-Cpvv1bZvep2Foe3ju3WP0,624
181
+ uncountable/types/post_base.py,sha256=nHqFw6U6ENxcuj_Y3VG-Sk1NEt4Tud2iBxPhRsJpQKM,258
182
+ uncountable/types/post_base_t.py,sha256=nZl7XQHc9cSnLgccaBZM93bcnSSjTlo2_TL40n-o7K0,734
183
+ uncountable/types/queued_job.py,sha256=TlQMf69foLfr134k00LvFEB4OuGAZHZJl9ro9UzVpaU,821
184
+ uncountable/types/queued_job_t.py,sha256=NyJSdn3VECk_EIONGq8_FXA7S2cJJmlPs32c8BAOEuY,3527
185
+ uncountable/types/recipe_identifiers.py,sha256=nqrubqofaeg_zV6vOrzqbiuX5tDUQYrGyvugpWX38mY,633
186
+ uncountable/types/recipe_identifiers_t.py,sha256=0L2xT9uqQCFr2F8VkAKdjsbQFp-CQ8-wKNn6UFoPcP4,2260
187
+ uncountable/types/recipe_inputs.py,sha256=dLqKvac-Ff3owutgvBD8Hc5KPoiu-6Zy22WOUJtAuus,330
188
+ uncountable/types/recipe_inputs_t.py,sha256=jZ4uFw20-87rBJswK0UYxDNp6AcHhug7nSm5-3HN0XA,710
189
+ uncountable/types/recipe_links.py,sha256=5E25kptfPIAd96RRlE9lbdRrWKkbLz21S5K_tJ4sKrA,322
190
+ uncountable/types/recipe_links_t.py,sha256=6igPp7IzbqJGmFJXrB1hbMGYrWkaqQ5yapXoKjj-G3w,1483
191
+ uncountable/types/recipe_metadata.py,sha256=98whijK1TSrvkk_5oumyb8312nZvb6nw7x4Op6jSJy8,420
192
+ uncountable/types/recipe_metadata_t.py,sha256=ORth4ae2SHtbASZmiVpMSZhE_-pNOqyzus-w7YM5YCw,1641
193
+ uncountable/types/recipe_output_metadata.py,sha256=SfG1IKRC0Sybp9v9kUjr7kTV_PO365I8W7jvgKZ9j60,301
194
+ uncountable/types/recipe_output_metadata_t.py,sha256=llf9O2vK6AFRva5hx0VdiKXT9XQ2iN-N25W_0Zlxp9g,723
195
+ uncountable/types/recipe_tags.py,sha256=tKIwHY677lZCxrmOk1bbuZQgDuf1n1cNyp6c5r1uRbo,270
196
+ uncountable/types/recipe_tags_t.py,sha256=7qi9m8NAq7BdocIBdYyMVArFnPJrwuX0B9qoqlJiwzM,670
197
+ uncountable/types/recipe_workflow_steps.py,sha256=fb55_sREdeZrtguIZOuy4ZcTLbRBNAxQ3A0oGbH8muA,950
198
+ uncountable/types/recipe_workflow_steps_t.py,sha256=dwjuFI6ncLBwr7Ufa-W26nrfF-BqZ_pKFIpKP05WqOo,3406
199
+ uncountable/types/recipes.py,sha256=6Z7bagYXX15kGlhYt_OFiYSD3lqFp4H0EquI1fUfYyk,286
200
+ uncountable/types/recipes_t.py,sha256=GBT56H34_pqAdeTgcye6ZNZLR1V47lG_S-R_uV-XUh8,652
201
+ uncountable/types/response.py,sha256=SJTwjTxZGItGJJYPZ_T1zTooEbtR5ZA8GT_cf8aXfn8,253
202
+ uncountable/types/response_t.py,sha256=I4lArMXf50SFWon_Tl9AJjqqrzvfeSXv_C-AKfnGcZM,646
203
+ uncountable/types/secret_retrieval.py,sha256=poY_nuZBIjNu64Wa0x5Ytsmh3OdAxps2kzuDgv1sa_8,571
204
+ uncountable/types/secret_retrieval_t.py,sha256=hcJRp2OLPd5m7twve63F8gloL8KFJiCtyJD17H6WiAc,2138
205
+ uncountable/types/units.py,sha256=yxuddayiE8cnzrjQiIsURisWc-Vm1F37uyS3fjM--Ao,254
206
+ uncountable/types/units_t.py,sha256=DUP2ydfWdPM8X4sBGOvm6g7CoZ1kqwpWidwSlWYQEek,643
207
+ uncountable/types/users.py,sha256=R-bFIh07mMl6HyxP8hKmlT-QMbBXZPZ7mVuOIeOlCsg,254
208
+ uncountable/types/users_t.py,sha256=rpwi31aZMyrNJgzUUPgo2lHAlYv82UKr5XGq1XmkrUA,666
209
+ uncountable/types/webhook_job.py,sha256=3LdsSMCNmZZrFwTHJpVR7XzIJiu2T2cbE-0ScwfLMBc,342
210
+ uncountable/types/webhook_job_t.py,sha256=BJvqdio9n93qhNw1aUWkU0WaGqXU_03qSzBM1gj3_9E,958
211
+ uncountable/types/workflows.py,sha256=sZhBDSzu85M0teTRiKNqd389oUK2tMcWGpKUlKIuSdY,332
212
+ uncountable/types/workflows_t.py,sha256=UCsCd_1-SHRZZljpQRxOuM74epKH2H5D2qfSNDzI2Ek,986
213
+ uncountable/types/api/__init__.py,sha256=gCgbynxG3jA8FQHzercKtrHKHkiIKr8APdZYUniAor8,55
214
+ uncountable/types/api/batch/__init__.py,sha256=gCgbynxG3jA8FQHzercKtrHKHkiIKr8APdZYUniAor8,55
215
+ uncountable/types/api/batch/execute_batch.py,sha256=jOjMcne7iEF7LP_dURjHzG0_0dLkW7FDKSKKyhi5OU4,1970
216
+ uncountable/types/api/batch/execute_batch_load_async.py,sha256=rxr2pvJ4w_2XnqzffX4Lu0JKB1s9AHZweSua-bvUK_A,1072
217
+ uncountable/types/api/chemical/__init__.py,sha256=gCgbynxG3jA8FQHzercKtrHKHkiIKr8APdZYUniAor8,55
218
+ uncountable/types/api/chemical/convert_chemical_formats.py,sha256=B1MT10IfFLapomSwzJyAKvyjrwKVDqEuESIhCJPJtgc,1778
219
+ uncountable/types/api/entity/__init__.py,sha256=gCgbynxG3jA8FQHzercKtrHKHkiIKr8APdZYUniAor8,55
220
+ uncountable/types/api/entity/create_entities.py,sha256=2MVtjfpegFwwUU0NGu-cpvgwusV-6B0zhCPWclXTEsc,1562
221
+ uncountable/types/api/entity/create_entity.py,sha256=cVEYcn3ao1vEiF7CiKd85OYBqqqd7ElwRyD_V5C_BHg,1647
222
+ uncountable/types/api/entity/get_entities_data.py,sha256=OUeBo0YkZmVTHT2EHAQt19rm2PU4OpJzOj3aCmZMw0Y,1433
223
+ uncountable/types/api/entity/grant_entity_permissions.py,sha256=Zx3FDHSjiBN_wRtmxbWSWdmT-CkzEoi2uoVLCIdS2Q8,1391
224
+ uncountable/types/api/entity/list_entities.py,sha256=1I6T6fjfolXx1lg8iRiCO5J0ieU0bdudPp31ZmMkXIQ,1895
225
+ uncountable/types/api/entity/lock_entity.py,sha256=cWRTNlXj6Ei1M0mHwfbhid7hQs4whCheUCOmf8PIGqw,1166
226
+ uncountable/types/api/entity/resolve_entity_ids.py,sha256=44B79L4erUB0G90WBGor0ZPs3XhdkuX7ZvgVF9uWB2M,1340
227
+ uncountable/types/api/entity/set_entity_field_values.py,sha256=ZYtRrsx0MWc0txC6yH2HtCONC5A0IolpqvwHm_YgirU,1179
228
+ uncountable/types/api/entity/set_values.py,sha256=2lANfjqPOcyxqDeISmzW0KghVbe8_i4QNkcLXzdAkag,1104
229
+ uncountable/types/api/entity/transition_entity_phase.py,sha256=HOFFjo4vEqxYTO_-ugFFIzI21llWAxXZ1m86ANrd8t4,2325
230
+ uncountable/types/api/entity/unlock_entity.py,sha256=D-EO1hQ5MckX_8D-pDgiOqMLCEV0rcjoCTNdqZUofNs,1129
231
+ uncountable/types/api/equipment/__init__.py,sha256=gCgbynxG3jA8FQHzercKtrHKHkiIKr8APdZYUniAor8,55
232
+ uncountable/types/api/equipment/associate_equipment_input.py,sha256=T10F9R5HaqEwqkUBDxxCRHqhWCX_ufHezKOgBuDYnEc,1176
233
+ uncountable/types/api/field_options/__init__.py,sha256=gCgbynxG3jA8FQHzercKtrHKHkiIKr8APdZYUniAor8,55
234
+ uncountable/types/api/field_options/upsert_field_options.py,sha256=7HOoqenKWU8r7u_M8FXM2WfPFD3_gpCuyI_tJG56C5w,1425
235
+ uncountable/types/api/files/__init__.py,sha256=gCgbynxG3jA8FQHzercKtrHKHkiIKr8APdZYUniAor8,55
236
+ uncountable/types/api/files/download_file.py,sha256=uk-GpdpuhC4Eng815c1LfTDBjPEdqVWKuCFGwJZmNf8,2208
237
+ uncountable/types/api/id_source/__init__.py,sha256=gCgbynxG3jA8FQHzercKtrHKHkiIKr8APdZYUniAor8,55
238
+ uncountable/types/api/id_source/list_id_source.py,sha256=rKNuf78xPMKzmwNErrSsAEikpQOfXc4HxKXZ8VNf6j4,1359
239
+ uncountable/types/api/id_source/match_id_source.py,sha256=9rA8IbFFZArWByFtXXFGmBNhX7g5URSRHmDa7GsvuLE,1306
240
+ uncountable/types/api/input_groups/__init__.py,sha256=gCgbynxG3jA8FQHzercKtrHKHkiIKr8APdZYUniAor8,55
241
+ uncountable/types/api/input_groups/get_input_group_names.py,sha256=bSEZZpWMLw-H433tIcfUMPsiC6y2Waw7_nLl_vVn5gY,1355
242
+ uncountable/types/api/inputs/__init__.py,sha256=gCgbynxG3jA8FQHzercKtrHKHkiIKr8APdZYUniAor8,55
243
+ uncountable/types/api/inputs/create_inputs.py,sha256=mhX7J19QyT93pN2MRePprm_RSmTSWynZE0zT-m25XjI,1969
244
+ uncountable/types/api/inputs/get_input_data.py,sha256=LGpeCzfwJg_HytTI-gr3Y9qXqdMheiiKTcB_oqCAs2g,2661
245
+ uncountable/types/api/inputs/get_input_names.py,sha256=ZUaIyUQRisaaLAl8X_VHqF4WqLacFhMwAFYZucGAPEc,1372
246
+ uncountable/types/api/inputs/get_inputs_data.py,sha256=nMgN_PE1AuKHnnYgMAwjYoWIQNjkvTyiiyt9G0xGJNc,2392
247
+ uncountable/types/api/inputs/set_input_attribute_values.py,sha256=aHZAEdV7YNao1nk_pwFXlAZ0W217eX9Fa7Uga3SX7LM,1570
248
+ uncountable/types/api/inputs/set_input_category.py,sha256=a2sV0pE_EsZd6DBS3ud2KLl4JhzrKFN5T2kHCNSaBf4,1138
249
+ uncountable/types/api/inputs/set_input_subcategories.py,sha256=y-Wttpmddpe7ps9OxsVe96x3t1R_p5h4xShJxI7i5MY,1175
250
+ uncountable/types/api/inputs/set_intermediate_type.py,sha256=8eodqt_J6OqmU4qyfbjgc43UrlG8xBfUEY-e9oRDFxI,1286
251
+ uncountable/types/api/material_families/__init__.py,sha256=gCgbynxG3jA8FQHzercKtrHKHkiIKr8APdZYUniAor8,55
252
+ uncountable/types/api/material_families/update_entity_material_families.py,sha256=UNKzPnwF7IjeaZFe8NwK4hwxyEe7Yd6v4p19yvf43-U,1577
253
+ uncountable/types/api/outputs/__init__.py,sha256=gCgbynxG3jA8FQHzercKtrHKHkiIKr8APdZYUniAor8,55
254
+ uncountable/types/api/outputs/get_output_data.py,sha256=Sg2gkAN9k9171eW1-5spsHKERgIFfPkX8mGe_t0ep2c,2703
255
+ uncountable/types/api/outputs/get_output_names.py,sha256=m4lSzpZF1g0CBtQBzOS0MH6hsuVOMs0FlJAKlTz6hW4,1356
256
+ uncountable/types/api/outputs/resolve_output_conditions.py,sha256=8Zs_CcCenDyypI3L0nEkVYx_fRJ-J7wq-J1sw5Ztass,2273
257
+ uncountable/types/api/permissions/__init__.py,sha256=gCgbynxG3jA8FQHzercKtrHKHkiIKr8APdZYUniAor8,55
258
+ uncountable/types/api/permissions/set_core_permissions.py,sha256=Kf5yt2IlwSqGpyEyIl1sTVO0wpdGEk984ojmK3-JwYk,3262
259
+ uncountable/types/api/project/__init__.py,sha256=gCgbynxG3jA8FQHzercKtrHKHkiIKr8APdZYUniAor8,55
260
+ uncountable/types/api/project/get_projects.py,sha256=DHThOC3XesjDPjle3LTW93ef6DTjrVKIK2AZcbv2_s0,1466
261
+ uncountable/types/api/project/get_projects_data.py,sha256=wp-mL40BNR9I1NXBXYVWlCGxLOFsT2T9B0aoFTYCuZA,1675
262
+ uncountable/types/api/recipe_links/__init__.py,sha256=gCgbynxG3jA8FQHzercKtrHKHkiIKr8APdZYUniAor8,55
263
+ uncountable/types/api/recipe_links/create_recipe_link.py,sha256=Z8WTy6SQPDt2zleRXhKzj2jS-R1QfLnQFg56XVctftQ,1368
264
+ uncountable/types/api/recipe_links/remove_recipe_link.py,sha256=HZQ15AqPjTqSEJjRY3L9RnU0T2EuzV4Wu7ilbeLhuDI,1354
265
+ uncountable/types/api/recipe_metadata/__init__.py,sha256=gCgbynxG3jA8FQHzercKtrHKHkiIKr8APdZYUniAor8,55
266
+ uncountable/types/api/recipe_metadata/get_recipe_metadata_data.py,sha256=fW-6_vBIGa5Wx8JvEdpKb3orXD60DX_wOeHnmMPduc8,1550
267
+ uncountable/types/api/recipes/__init__.py,sha256=gCgbynxG3jA8FQHzercKtrHKHkiIKr8APdZYUniAor8,55
268
+ uncountable/types/api/recipes/add_recipe_to_project.py,sha256=vJL6DljCu4okNHvXJ5_uaBj0-QDEm9iTvVGMLYyDd2U,1061
269
+ uncountable/types/api/recipes/archive_recipes.py,sha256=07Rjd9kwh5pMpiMXNr9OfjOB4vYXeuLjQtBxrXkXC7o,1024
270
+ uncountable/types/api/recipes/associate_recipe_as_input.py,sha256=TtsAJRT9vRjnsIh0IvfFimA2hstZvgyn6rpaDIsDfK4,1194
271
+ uncountable/types/api/recipes/associate_recipe_as_lot.py,sha256=_4SgFfH-wFxW9Vevv9k3G3T10Uz8CMLjuiDEv1oT2So,1138
272
+ uncountable/types/api/recipes/clear_recipe_outputs.py,sha256=BfTQrV79UePkJ4HSSixV1AZovgVdIIIKK2OLJe1r8Dw,1082
273
+ uncountable/types/api/recipes/create_recipe.py,sha256=tVeQgikCWAwGtxpq2vLyXd5Aeqo_8Tde64x5GAOJl50,1472
274
+ uncountable/types/api/recipes/create_recipes.py,sha256=J1CBE13d8JaVpUxOftFg1Plo8RKa0vc-A2nHdO1yoj8,1862
275
+ uncountable/types/api/recipes/disassociate_recipe_as_input.py,sha256=zWUfwJlkgWexblqKCKCF5HWR40ynQ8rg_PPo2WPGISY,1106
276
+ uncountable/types/api/recipes/edit_recipe_inputs.py,sha256=NEK0PrM-SnGx95KcjpSWimi3xTrOMKO8BMURom08ppc,9837
277
+ uncountable/types/api/recipes/get_column_calculation_values.py,sha256=9eqURjD2Mwm2lyV1bJIq66Z7a3enLhhx_scZBt4SYYc,1671
278
+ uncountable/types/api/recipes/get_curve.py,sha256=C-elYAKcBw7P5bWwN-8p_SWj15l5aBJrKNR8yjphZ-Q,1085
279
+ uncountable/types/api/recipes/get_recipe_calculations.py,sha256=iBmkhKC1qBFxuPPziM3LD6tGsdsN_xb4NcUaJwF6cHU,1679
280
+ uncountable/types/api/recipes/get_recipe_links.py,sha256=jYygHnuzTzuc_H8AG72Ihrb38kEhtfbVNlb4b7elLfI,1149
281
+ uncountable/types/api/recipes/get_recipe_names.py,sha256=HXv39OI6GRedSAKOhurEQEY_djaxvJcxlTTWghLgA5I,1274
282
+ uncountable/types/api/recipes/get_recipe_output_metadata.py,sha256=7lF2cnRsBLPDSsjlNIy-aJ4Dao5-qe7WrNaf4XNmq74,1703
283
+ uncountable/types/api/recipes/get_recipes_data.py,sha256=srZBvl8dCdoo7yil0D1ohAxnbMaCS28ctCH93NaYQd0,6099
284
+ uncountable/types/api/recipes/lock_recipes.py,sha256=8z_g5lokbzkATZvN5Vpvx6uXS3xPZN77AP5OhHPsGhc,1581
285
+ uncountable/types/api/recipes/remove_recipe_from_project.py,sha256=_KWbYnMMEOZAaC_jdXZvCEYXJaVhs3x27ZWlJbq3CV4,1076
286
+ uncountable/types/api/recipes/set_recipe_inputs.py,sha256=RvWj2SOtcuy_msp9pUjz20O3Y_EjEMKd48o-RhpCDNE,1583
287
+ uncountable/types/api/recipes/set_recipe_metadata.py,sha256=R4GVqpMJdJuoSXsJx1e4vhmWqKKTPMyPPEArwV45crI,1104
288
+ uncountable/types/api/recipes/set_recipe_output_annotations.py,sha256=yczFBmuB0grzNWsnXspCPUsDA608M9wGkJ2dugyxG4U,3526
289
+ uncountable/types/api/recipes/set_recipe_output_file.py,sha256=W_qvEkZxzDczwU9EZ7zKyBmLGnO6GFqMsJ3zwXCnpA0,1502
290
+ uncountable/types/api/recipes/set_recipe_outputs.py,sha256=hNeV3hwPw3fT-pnhe17fPPgLH7pfpva0kjpt2NTt55E,2104
291
+ uncountable/types/api/recipes/set_recipe_tags.py,sha256=HS5GG-nTy0vTNTANG-ROawku0VhzOs0hIzGKfRFefYY,3098
292
+ uncountable/types/api/recipes/unarchive_recipes.py,sha256=G0jYuarNZLmTCQ6m5_ZAUwBl4M8_cqKRlP-jMJp-Rcw,1000
293
+ uncountable/types/api/recipes/unlock_recipes.py,sha256=QFvz13eJipWQlIRrqOybnIPeJxfR4yZM8yIr841jd28,1258
294
+ uncountable/types/api/triggers/__init__.py,sha256=gCgbynxG3jA8FQHzercKtrHKHkiIKr8APdZYUniAor8,55
295
+ uncountable/types/api/triggers/run_trigger.py,sha256=diX1ix_5hkti1F1uYoZhP5iyc6GHAU5coKgqq5syLhI,1059
296
+ uncountable/types/api/uploader/__init__.py,sha256=gCgbynxG3jA8FQHzercKtrHKHkiIKr8APdZYUniAor8,55
297
+ uncountable/types/api/uploader/invoke_uploader.py,sha256=-loZzBihKqx63eP-f5RuV1mu6tgkRTZmIc545kklZLk,1273
298
+ UncountablePythonSDK-0.0.93.dist-info/METADATA,sha256=Pwy0kXB5Pc8CCUeDNAzQXwTcJwZb9N_7jTpUigM7KFw,2064
299
+ UncountablePythonSDK-0.0.93.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
300
+ UncountablePythonSDK-0.0.93.dist-info/top_level.txt,sha256=1UVGjAU-6hJY9qw2iJ7nCBeEwZ793AEN5ZfKX9A1uj4,31
301
+ UncountablePythonSDK-0.0.93.dist-info/RECORD,,
@@ -96,7 +96,7 @@ def is_missing(field_type: typing.Any) -> bool:
96
96
  return not (len(args) == 0 or args[0] is not MissingSentryType)
97
97
 
98
98
 
99
- def _invoke_tuple_parsers(
99
+ def _invoke_tuple_parsers[T](
100
100
  tuple_type: type[T],
101
101
  arg_parsers: typing.Sequence[typing.Callable[[typing.Any], object]],
102
102
  has_ellipsis: bool,
@@ -133,7 +133,7 @@ def _invoke_fallback_parsers(
133
133
  ) from ExceptionGroup("Fallback Parser Exception", exceptions)
134
134
 
135
135
 
136
- def _invoke_membership_parser(
136
+ def _invoke_membership_parser[T](
137
137
  expected_values: set[T],
138
138
  value: typing.Any,
139
139
  ) -> T:
@@ -148,7 +148,7 @@ def _invoke_membership_parser(
148
148
  raise ValueError(f"Expected value from {expected_values} but got value {value}")
149
149
 
150
150
 
151
- def _build_parser_discriminated_union(
151
+ def _build_parser_discriminated_union[T](
152
152
  context: ParserContext,
153
153
  discriminator: str,
154
154
  discriminator_map: dict[str, ParserFunction[T]],
@@ -170,7 +170,7 @@ def _build_parser_discriminated_union(
170
170
  return parse
171
171
 
172
172
 
173
- def _build_parser_inner(
173
+ def _build_parser_inner[T](
174
174
  parsed_type: type[T],
175
175
  context: ParserContext,
176
176
  ) -> ParserFunction[T]:
@@ -368,7 +368,7 @@ def _build_parser_inner(
368
368
  raise ValueError(f"Unhandled type {parsed_type}")
369
369
 
370
370
 
371
- def _build_parser_dataclass(
371
+ def _build_parser_dataclass[T](
372
372
  parsed_type: type[T],
373
373
  context: ParserContext,
374
374
  ) -> ParserFunction[T]:
@@ -479,7 +479,7 @@ def _build_parser_dataclass(
479
479
  _CACHE_MAP: dict[ParserOptions, ParserCache] = defaultdict(ParserCache)
480
480
 
481
481
 
482
- def build_parser(
482
+ def build_parser[T](
483
483
  parsed_type: type[T],
484
484
  options: ParserOptions,
485
485
  ) -> ParserFunction[T]:
@@ -501,7 +501,7 @@ def build_parser(
501
501
  return built_parser
502
502
 
503
503
 
504
- class CachedParser(typing.Generic[T]):
504
+ class CachedParser[T]:
505
505
  def __init__(
506
506
  self,
507
507
  args: type[T],
@@ -1,6 +1,7 @@
1
1
  from io import BytesIO
2
2
 
3
3
  from boto3.session import Session
4
+ from mypy_boto3_s3.service_resource import Bucket
4
5
 
5
6
  from pkgs.filesystem_utils.file_type_utils import (
6
7
  FileObjectData,
@@ -37,7 +38,7 @@ class S3Session(FileSystemSession):
37
38
  aws_session_token=self.config.session_token,
38
39
  )
39
40
 
40
- self.bucket = s3_resource.Bucket(self.config.bucket_name)
41
+ self.bucket: Bucket | None = s3_resource.Bucket(self.config.bucket_name)
41
42
 
42
43
  def __enter__(self) -> "S3Session":
43
44
  self.start()
@@ -16,7 +16,7 @@ class SerialBase:
16
16
  from_decorator: bool = False
17
17
 
18
18
 
19
- def get_serial_annotation(parsed_type: type[T]) -> SerialBase | None:
19
+ def get_serial_annotation[T](parsed_type: type[T]) -> SerialBase | None:
20
20
  if not hasattr(parsed_type, "__metadata__"):
21
21
  return None
22
22
  metadata = parsed_type.__metadata__ # type:ignore[attr-defined]
@@ -28,7 +28,7 @@ def get_serial_annotation(parsed_type: type[T]) -> SerialBase | None:
28
28
  return serial
29
29
 
30
30
 
31
- class SerialInspector(typing.Generic[T]):
31
+ class SerialInspector[T]:
32
32
  def __init__(self, parsed_type: type[T], serial_base: SerialBase) -> None:
33
33
  self._parsed_type = parsed_type
34
34
  self._serial_base = serial_base
@@ -53,7 +53,7 @@ class SerialInspector(typing.Generic[T]):
53
53
  return self._serial_base.is_dynamic_allowed
54
54
 
55
55
 
56
- def unwrap_annotated(parsed_type: type[T]) -> type[T]:
56
+ def unwrap_annotated[T](parsed_type: type[T]) -> type[T]:
57
57
  """
58
58
  If the type is an annotated type then return the origin of it.
59
59
  Otherwise return the original type.
@@ -26,5 +26,5 @@ MISSING_SENTRY = MissingSentryType()
26
26
  MissingType = Union[MissingSentryType, ClassT]
27
27
 
28
28
 
29
- def coalesce_missing_sentry(value: MissingType[ClassT]) -> ClassT | None:
29
+ def coalesce_missing_sentry[ClassT](value: MissingType[ClassT]) -> ClassT | None:
30
30
  return None if isinstance(value, MissingSentryType) else value
@@ -26,7 +26,7 @@ def serial_alias_annotation(
26
26
  )
27
27
 
28
28
 
29
- def _get_serial_alias(parsed_type: type[T]) -> _SerialAlias | None:
29
+ def _get_serial_alias[T](parsed_type: type[T]) -> _SerialAlias | None:
30
30
  serial = get_serial_annotation(parsed_type)
31
31
  if not isinstance(serial, _SerialAlias):
32
32
  return None
@@ -39,7 +39,7 @@ class SerialAliasInspector(SerialInspector[T]):
39
39
  self._serial_alias = serial_alias
40
40
 
41
41
 
42
- def get_serial_alias_data(parsed_type: type[T]) -> SerialAliasInspector[T] | None:
42
+ def get_serial_alias_data[T](parsed_type: type[T]) -> SerialAliasInspector[T] | None:
43
43
  serial = _get_serial_alias(parsed_type)
44
44
  if serial is None:
45
45
  return None
@@ -119,7 +119,7 @@ def get_merged_serial_class_data(type_class: type[Any]) -> _SerialClassData | No
119
119
  return base_class_data
120
120
 
121
121
 
122
- def get_serial_class_data(
122
+ def get_serial_class_data[_ClassT](
123
123
  type_class: type[_ClassT],
124
124
  ) -> SerialClassDataInspector[_ClassT]:
125
125
  return SerialClassDataInspector(
@@ -6,7 +6,7 @@ from .serial_class import get_merged_serial_class_data
6
6
  T = typing.TypeVar("T")
7
7
 
8
8
 
9
- def get_serial_data(parsed_type: type[T]) -> SerialInspector[T] | None:
9
+ def get_serial_data[T](parsed_type: type[T]) -> SerialInspector[T] | None:
10
10
  serial = get_serial_annotation(parsed_type)
11
11
  if serial is None:
12
12
  serial = get_merged_serial_class_data(parsed_type)
@@ -6,7 +6,7 @@ from .annotation import SerialBase, SerialInspector, get_serial_annotation
6
6
  T = typing.TypeVar("T")
7
7
 
8
8
 
9
- class IdentityHashWrapper(typing.Generic[T]):
9
+ class IdentityHashWrapper[T]:
10
10
  """This allows unhashable types to be used in the SerialUnion, like dict.
11
11
  Since we have only one copy of the types themselves, we rely on
12
12
  object identity for the hashing."""
@@ -49,7 +49,7 @@ def serial_union_annotation(
49
49
  )
50
50
 
51
51
 
52
- def _get_serial_union(parsed_type: type[T]) -> _SerialUnion | None:
52
+ def _get_serial_union[T](parsed_type: type[T]) -> _SerialUnion | None:
53
53
  serial = get_serial_annotation(parsed_type)
54
54
  if not isinstance(serial, _SerialUnion):
55
55
  return None
@@ -76,7 +76,7 @@ class SerialClassInspector(SerialInspector[T]):
76
76
  return self._serial_union.discriminator_map.inner
77
77
 
78
78
 
79
- def get_serial_union_data(parsed_type: type[T]) -> SerialClassInspector[T] | None:
79
+ def get_serial_union_data[T](parsed_type: type[T]) -> SerialClassInspector[T] | None:
80
80
  serial = _get_serial_union(parsed_type)
81
81
  if serial is None:
82
82
  return None
@@ -12,7 +12,6 @@ from typing import (
12
12
  Any,
13
13
  ClassVar,
14
14
  Protocol,
15
- TypeVar,
16
15
  Union,
17
16
  overload,
18
17
  )
@@ -34,14 +33,12 @@ if TYPE_CHECKING:
34
33
  else:
35
34
  JsonValue = Union[JsonScalar, dict[str, Any], list[Any]]
36
35
 
37
- T = TypeVar("T")
38
-
39
36
 
40
37
  class Dataclass(Protocol):
41
38
  __dataclass_fields__: ClassVar[dict] # type: ignore[type-arg,unused-ignore]
42
39
 
43
40
 
44
- def identity(x: T) -> T:
41
+ def identity[T](x: T) -> T:
45
42
  return x
46
43
 
47
44
 
@@ -6,7 +6,6 @@ import os
6
6
  import sys
7
7
  from collections import defaultdict
8
8
  from dataclasses import dataclass
9
- from typing import TypeVar
10
9
 
11
10
  from main.base.types import actions_registry_t
12
11
  from pkgs.type_spec import builder
@@ -22,9 +21,6 @@ key_short_description = "short_description"
22
21
  key_description = "description"
23
22
 
24
23
 
25
- TypeT = TypeVar("TypeT")
26
-
27
-
28
24
  class InvalidSpecException(Exception):
29
25
  pass
30
26
 
pkgs/type_spec/builder.py CHANGED
@@ -901,16 +901,9 @@ class SpecEndpoint:
901
901
  account_type: str | None
902
902
  route_group: str | None
903
903
 
904
- # to be deprecated in favor of path_per_api_endpoint:
905
- # default function, path details
906
- function: str | None
907
- root: EndpointKey
908
- path_root: str
909
- path_dirname: str
910
- path_basename: str
911
-
912
904
  # function, path details per api endpoint
913
905
  path_per_api_endpoint: dict[str, EndpointSpecificPath]
906
+ default_endpoint_key: EndpointKey
914
907
 
915
908
  is_external: bool = False
916
909
 
@@ -997,14 +990,18 @@ class SpecEndpoint:
997
990
  self.has_attachment = data.get("has_attachment", False)
998
991
  self.desc = data.get("desc")
999
992
 
993
+ # compatibility with single-endpoint files
1000
994
  default_endpoint_path = parse_endpoint_specific_path(
1001
995
  builder,
1002
996
  {"path": data.get("path"), "function": data.get("function")},
1003
997
  )
1004
998
  if default_endpoint_path is not None:
1005
- self.root = default_endpoint_path.root
999
+ assert default_endpoint_path.root in builder.api_endpoints, (
1000
+ "Default endpoint is not a valid API endpoint"
1001
+ )
1002
+ self.default_endpoint_key = default_endpoint_path.root
1006
1003
  self.path_per_api_endpoint = {
1007
- self.root: default_endpoint_path,
1004
+ self.default_endpoint_key: default_endpoint_path,
1008
1005
  }
1009
1006
  else:
1010
1007
  self.path_per_api_endpoint = {}
@@ -1021,27 +1018,34 @@ class SpecEndpoint:
1021
1018
  if shared_function_name is None:
1022
1019
  shared_function_name = fn_name
1023
1020
  assert shared_function_name == fn_name
1024
- assert self.path_per_api_endpoint != {}
1025
1021
 
1026
- assert builder.top_namespace in self.path_per_api_endpoint
1027
- self.root = builder.top_namespace
1022
+ if builder.top_namespace in self.path_per_api_endpoint:
1023
+ self.default_endpoint_key = builder.top_namespace
1024
+ elif len(self.path_per_api_endpoint) == 1:
1025
+ self.default_endpoint_key = next(
1026
+ iter(self.path_per_api_endpoint.keys())
1027
+ )
1028
+ else:
1029
+ raise RuntimeError("no clear default endpoint")
1028
1030
 
1029
- default_endpoint_path = self.path_per_api_endpoint[self.root]
1030
- self.function = default_endpoint_path.function
1031
- self.path_dirname = default_endpoint_path.path_dirname
1032
- self.path_basename = default_endpoint_path.path_basename
1033
- self.path_root = default_endpoint_path.path_root
1031
+ assert len(self.path_per_api_endpoint) > 0, (
1032
+ "Missing API endpoint path and function definitions for API call"
1033
+ )
1034
1034
 
1035
1035
  # IMPROVE: remove need for is_external flag
1036
- self.is_external = self.path_root == "api/external"
1036
+ self.is_external = (
1037
+ self.path_per_api_endpoint[self.default_endpoint_key].path_root
1038
+ == "api/external"
1039
+ )
1037
1040
 
1038
1041
  assert self.is_sdk != EndpointEmitType.EMIT_ENDPOINT or self.desc is not None, (
1039
- f"Endpoint description required for SDK endpoints, missing: {self.path_dirname}/{self.path_basename}"
1042
+ f"Endpoint description required for SDK endpoints, missing: {self.resolved_path}"
1040
1043
  )
1041
1044
 
1042
1045
  @property
1043
1046
  def resolved_path(self: Self) -> str:
1044
- return f"{self.path_root}/{self.path_dirname}/{self.path_basename}"
1047
+ default_endpoint_path = self.path_per_api_endpoint[self.default_endpoint_key]
1048
+ return f"{default_endpoint_path.path_root}/{default_endpoint_path.path_dirname}/{default_endpoint_path.path_basename}"
1045
1049
 
1046
1050
 
1047
1051
  def _parse_const(