UncountablePythonSDK 0.0.91__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 (193) hide show
  1. {UncountablePythonSDK-0.0.91.dist-info → UncountablePythonSDK-0.0.93.dist-info}/METADATA +2 -2
  2. UncountablePythonSDK-0.0.93.dist-info/RECORD +301 -0
  3. {UncountablePythonSDK-0.0.91.dist-info → UncountablePythonSDK-0.0.93.dist-info}/WHEEL +1 -1
  4. examples/set_recipe_metadata_file.py +1 -1
  5. examples/upload_files.py +1 -2
  6. pkgs/argument_parser/__init__.py +3 -0
  7. pkgs/argument_parser/argument_parser.py +52 -23
  8. pkgs/filesystem_utils/__init__.py +1 -0
  9. pkgs/filesystem_utils/_gdrive_session.py +4 -4
  10. pkgs/filesystem_utils/_s3_session.py +2 -1
  11. pkgs/filesystem_utils/_sftp_session.py +2 -3
  12. pkgs/filesystem_utils/file_type_utils.py +10 -10
  13. pkgs/serialization/annotation.py +5 -5
  14. pkgs/serialization/missing_sentry.py +1 -1
  15. pkgs/serialization/serial_alias.py +3 -3
  16. pkgs/serialization/serial_class.py +10 -10
  17. pkgs/serialization/serial_generic.py +1 -1
  18. pkgs/serialization/serial_union.py +10 -10
  19. pkgs/serialization_util/__init__.py +2 -0
  20. pkgs/serialization_util/serialization_helpers.py +1 -4
  21. pkgs/type_spec/actions_registry/__main__.py +0 -4
  22. pkgs/type_spec/builder.py +121 -40
  23. pkgs/type_spec/config.py +10 -5
  24. pkgs/type_spec/emit_open_api.py +2 -2
  25. pkgs/type_spec/emit_open_api_util.py +1 -1
  26. pkgs/type_spec/emit_python.py +145 -63
  27. pkgs/type_spec/emit_typescript.py +57 -10
  28. pkgs/type_spec/load_types.py +1 -2
  29. pkgs/type_spec/open_api_util.py +1 -2
  30. pkgs/type_spec/parts/base.py.prepart +2 -0
  31. pkgs/type_spec/type_info/emit_type_info.py +8 -8
  32. pkgs/type_spec/util.py +5 -7
  33. pkgs/type_spec/value_spec/__main__.py +15 -5
  34. pkgs/type_spec/value_spec/emit_python.py +5 -2
  35. pkgs/type_spec/value_spec/types.py +1 -1
  36. uncountable/core/client.py +16 -15
  37. uncountable/core/file_upload.py +39 -15
  38. uncountable/integration/construct_client.py +3 -3
  39. uncountable/integration/executors/generic_upload_executor.py +1 -1
  40. uncountable/integration/job.py +2 -2
  41. uncountable/integration/queue_runner/command_server/types.py +1 -1
  42. uncountable/integration/queue_runner/worker.py +1 -1
  43. uncountable/integration/server.py +4 -4
  44. uncountable/integration/telemetry.py +11 -0
  45. uncountable/types/__init__.py +0 -1
  46. uncountable/types/api/batch/execute_batch.py +1 -2
  47. uncountable/types/api/batch/execute_batch_load_async.py +0 -1
  48. uncountable/types/api/chemical/convert_chemical_formats.py +0 -1
  49. uncountable/types/api/entity/create_entities.py +3 -4
  50. uncountable/types/api/entity/create_entity.py +4 -5
  51. uncountable/types/api/entity/get_entities_data.py +0 -1
  52. uncountable/types/api/entity/grant_entity_permissions.py +3 -4
  53. uncountable/types/api/entity/list_entities.py +5 -6
  54. uncountable/types/api/entity/lock_entity.py +1 -2
  55. uncountable/types/api/entity/resolve_entity_ids.py +2 -3
  56. uncountable/types/api/entity/set_entity_field_values.py +0 -1
  57. uncountable/types/api/entity/set_values.py +0 -1
  58. uncountable/types/api/entity/transition_entity_phase.py +1 -2
  59. uncountable/types/api/entity/unlock_entity.py +0 -1
  60. uncountable/types/api/equipment/associate_equipment_input.py +0 -1
  61. uncountable/types/api/field_options/upsert_field_options.py +3 -4
  62. uncountable/types/api/files/download_file.py +1 -2
  63. uncountable/types/api/id_source/list_id_source.py +3 -4
  64. uncountable/types/api/id_source/match_id_source.py +1 -2
  65. uncountable/types/api/input_groups/get_input_group_names.py +0 -1
  66. uncountable/types/api/inputs/create_inputs.py +4 -5
  67. uncountable/types/api/inputs/get_input_data.py +5 -6
  68. uncountable/types/api/inputs/get_input_names.py +3 -4
  69. uncountable/types/api/inputs/get_inputs_data.py +0 -1
  70. uncountable/types/api/inputs/set_input_attribute_values.py +2 -3
  71. uncountable/types/api/inputs/set_input_category.py +2 -3
  72. uncountable/types/api/inputs/set_input_subcategories.py +0 -1
  73. uncountable/types/api/inputs/set_intermediate_type.py +1 -2
  74. uncountable/types/api/material_families/update_entity_material_families.py +1 -2
  75. uncountable/types/api/outputs/get_output_data.py +6 -7
  76. uncountable/types/api/outputs/get_output_names.py +2 -3
  77. uncountable/types/api/outputs/resolve_output_conditions.py +2 -3
  78. uncountable/types/api/permissions/set_core_permissions.py +3 -4
  79. uncountable/types/api/project/get_projects.py +3 -4
  80. uncountable/types/api/project/get_projects_data.py +4 -5
  81. uncountable/types/api/recipe_links/create_recipe_link.py +1 -2
  82. uncountable/types/api/recipe_links/remove_recipe_link.py +1 -2
  83. uncountable/types/api/recipe_metadata/get_recipe_metadata_data.py +3 -4
  84. uncountable/types/api/recipes/add_recipe_to_project.py +0 -1
  85. uncountable/types/api/recipes/archive_recipes.py +1 -2
  86. uncountable/types/api/recipes/associate_recipe_as_input.py +2 -3
  87. uncountable/types/api/recipes/associate_recipe_as_lot.py +0 -1
  88. uncountable/types/api/recipes/clear_recipe_outputs.py +0 -1
  89. uncountable/types/api/recipes/create_recipe.py +6 -7
  90. uncountable/types/api/recipes/create_recipes.py +4 -5
  91. uncountable/types/api/recipes/disassociate_recipe_as_input.py +0 -1
  92. uncountable/types/api/recipes/edit_recipe_inputs.py +9 -10
  93. uncountable/types/api/recipes/get_column_calculation_values.py +1 -2
  94. uncountable/types/api/recipes/get_curve.py +2 -3
  95. uncountable/types/api/recipes/get_recipe_calculations.py +3 -4
  96. uncountable/types/api/recipes/get_recipe_links.py +1 -2
  97. uncountable/types/api/recipes/get_recipe_names.py +0 -1
  98. uncountable/types/api/recipes/get_recipe_output_metadata.py +0 -1
  99. uncountable/types/api/recipes/get_recipes_data.py +22 -23
  100. uncountable/types/api/recipes/lock_recipes.py +3 -4
  101. uncountable/types/api/recipes/remove_recipe_from_project.py +0 -1
  102. uncountable/types/api/recipes/set_recipe_inputs.py +6 -7
  103. uncountable/types/api/recipes/set_recipe_metadata.py +0 -1
  104. uncountable/types/api/recipes/set_recipe_output_annotations.py +5 -6
  105. uncountable/types/api/recipes/set_recipe_output_file.py +2 -3
  106. uncountable/types/api/recipes/set_recipe_outputs.py +8 -9
  107. uncountable/types/api/recipes/set_recipe_tags.py +2 -3
  108. uncountable/types/api/recipes/unarchive_recipes.py +0 -1
  109. uncountable/types/api/recipes/unlock_recipes.py +2 -3
  110. uncountable/types/api/triggers/run_trigger.py +1 -2
  111. uncountable/types/api/uploader/invoke_uploader.py +2 -3
  112. uncountable/types/async_batch.py +0 -1
  113. uncountable/types/async_batch_processor.py +23 -24
  114. uncountable/types/async_batch_t.py +5 -6
  115. uncountable/types/async_jobs.py +0 -1
  116. uncountable/types/async_jobs_t.py +1 -2
  117. uncountable/types/auth_retrieval.py +0 -1
  118. uncountable/types/auth_retrieval_t.py +2 -3
  119. uncountable/types/base.py +0 -1
  120. uncountable/types/base_t.py +2 -1
  121. uncountable/types/calculations.py +0 -1
  122. uncountable/types/calculations_t.py +0 -1
  123. uncountable/types/chemical_structure.py +0 -1
  124. uncountable/types/chemical_structure_t.py +3 -4
  125. uncountable/types/client_base.py +65 -66
  126. uncountable/types/client_config.py +0 -1
  127. uncountable/types/client_config_t.py +1 -2
  128. uncountable/types/curves.py +0 -1
  129. uncountable/types/curves_t.py +4 -5
  130. uncountable/types/entity.py +0 -1
  131. uncountable/types/entity_t.py +3 -4
  132. uncountable/types/experiment_groups.py +0 -1
  133. uncountable/types/experiment_groups_t.py +0 -1
  134. uncountable/types/field_values.py +0 -1
  135. uncountable/types/field_values_t.py +6 -7
  136. uncountable/types/fields.py +0 -1
  137. uncountable/types/fields_t.py +0 -1
  138. uncountable/types/generic_upload.py +0 -1
  139. uncountable/types/generic_upload_t.py +7 -8
  140. uncountable/types/id_source.py +0 -1
  141. uncountable/types/id_source_t.py +2 -3
  142. uncountable/types/identifier.py +0 -1
  143. uncountable/types/identifier_t.py +1 -2
  144. uncountable/types/input_attributes.py +0 -1
  145. uncountable/types/input_attributes_t.py +2 -3
  146. uncountable/types/inputs.py +0 -1
  147. uncountable/types/inputs_t.py +2 -3
  148. uncountable/types/integration_server.py +0 -1
  149. uncountable/types/integration_server_t.py +2 -3
  150. uncountable/types/job_definition.py +0 -1
  151. uncountable/types/job_definition_t.py +16 -17
  152. uncountable/types/outputs.py +0 -1
  153. uncountable/types/outputs_t.py +1 -2
  154. uncountable/types/overrides.py +0 -1
  155. uncountable/types/overrides_t.py +0 -1
  156. uncountable/types/permissions.py +0 -1
  157. uncountable/types/permissions_t.py +1 -2
  158. uncountable/types/phases.py +0 -1
  159. uncountable/types/phases_t.py +0 -1
  160. uncountable/types/post_base.py +0 -1
  161. uncountable/types/post_base_t.py +1 -2
  162. uncountable/types/queued_job.py +0 -1
  163. uncountable/types/queued_job_t.py +2 -3
  164. uncountable/types/recipe_identifiers.py +0 -1
  165. uncountable/types/recipe_identifiers_t.py +3 -4
  166. uncountable/types/recipe_inputs.py +0 -1
  167. uncountable/types/recipe_inputs_t.py +1 -2
  168. uncountable/types/recipe_links.py +0 -1
  169. uncountable/types/recipe_links_t.py +2 -3
  170. uncountable/types/recipe_metadata.py +0 -1
  171. uncountable/types/recipe_metadata_t.py +6 -7
  172. uncountable/types/recipe_output_metadata.py +0 -1
  173. uncountable/types/recipe_output_metadata_t.py +0 -1
  174. uncountable/types/recipe_tags.py +0 -1
  175. uncountable/types/recipe_tags_t.py +0 -1
  176. uncountable/types/recipe_workflow_steps.py +0 -1
  177. uncountable/types/recipe_workflow_steps_t.py +2 -3
  178. uncountable/types/recipes.py +0 -1
  179. uncountable/types/recipes_t.py +0 -1
  180. uncountable/types/response.py +0 -1
  181. uncountable/types/response_t.py +0 -1
  182. uncountable/types/secret_retrieval.py +0 -1
  183. uncountable/types/secret_retrieval_t.py +3 -4
  184. uncountable/types/units.py +0 -1
  185. uncountable/types/units_t.py +0 -1
  186. uncountable/types/users.py +0 -1
  187. uncountable/types/users_t.py +0 -1
  188. uncountable/types/webhook_job.py +0 -1
  189. uncountable/types/webhook_job_t.py +0 -1
  190. uncountable/types/workflows.py +0 -1
  191. uncountable/types/workflows_t.py +1 -2
  192. UncountablePythonSDK-0.0.91.dist-info/RECORD +0 -301
  193. {UncountablePythonSDK-0.0.91.dist-info → UncountablePythonSDK-0.0.93.dist-info}/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.1
1
+ Metadata-Version: 2.2
2
2
  Name: UncountablePythonSDK
3
- Version: 0.0.91
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,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (75.7.0)
2
+ Generator: setuptools (75.8.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5
 
@@ -18,7 +18,7 @@ client = Client(
18
18
  )
19
19
  uploaded_file = client.upload_files(
20
20
  file_uploads=[
21
- MediaFileUpload(path="/home/logan/Downloads/my_file_to_upload.csv"),
21
+ MediaFileUpload(path="Downloads/my_file_to_upload.csv"),
22
22
  ]
23
23
  )[0]
24
24
 
examples/upload_files.py CHANGED
@@ -12,8 +12,7 @@ client = Client(
12
12
  )
13
13
  uploaded = client.upload_files(
14
14
  file_uploads=[
15
- MediaFileUpload(path="/my/file/path.doc"),
16
- MediaFileUpload(path="/my/file/path2.doc"),
15
+ MediaFileUpload(path="Downloads/file"),
17
16
  ]
18
17
  )
19
18
  pprint(uploaded)
@@ -1,8 +1,11 @@
1
1
  from .argument_parser import CachedParser as CachedParser
2
2
  from .argument_parser import ParserError as ParserError
3
+ from .argument_parser import ParserExtraFieldsError as ParserExtraFieldsError
3
4
  from .argument_parser import ParserFunction as ParserFunction
4
5
  from .argument_parser import ParserOptions as ParserOptions
6
+ from .argument_parser import SourceEncoding as SourceEncoding
5
7
  from .argument_parser import build_parser as build_parser
8
+ from .argument_parser import is_union as is_union
6
9
  from .case_convert import camel_to_snake_case as camel_to_snake_case
7
10
  from .case_convert import kebab_to_pascal_case as kebab_to_pascal_case
8
11
  from .case_convert import snake_to_camel_case as snake_to_camel_case
@@ -5,7 +5,6 @@ import math
5
5
  import types
6
6
  import typing
7
7
  from collections import defaultdict
8
- from dataclasses import MISSING, dataclass
9
8
  from datetime import date, datetime
10
9
  from decimal import Decimal
11
10
  from enum import Enum, auto
@@ -35,7 +34,7 @@ class SourceEncoding(Enum):
35
34
  STORAGE = auto()
36
35
 
37
36
 
38
- @dataclass(frozen=True, eq=True)
37
+ @dataclasses.dataclass(frozen=True, eq=True)
39
38
  class ParserOptions:
40
39
  encoding: SourceEncoding
41
40
  strict_property_parsing: bool = False
@@ -57,8 +56,12 @@ class ParserOptions:
57
56
  def from_camel_case(self) -> bool:
58
57
  return self.encoding == SourceEncoding.API
59
58
 
59
+ @property
60
+ def allow_direct_dataclass(self) -> bool:
61
+ return self.encoding == SourceEncoding.STORAGE
62
+
60
63
 
61
- @dataclass(frozen=True)
64
+ @dataclasses.dataclass(frozen=True)
62
65
  class ParserContext:
63
66
  options: ParserOptions
64
67
  cache: ParserCache
@@ -77,21 +80,23 @@ class ParserExtraFieldsError(ParserError):
77
80
  return f"extra fields were provided: {', '.join(self.extra_fields)}"
78
81
 
79
82
 
83
+ def is_union(field_type: typing.Any) -> bool:
84
+ origin = typing.get_origin(field_type)
85
+ return origin is typing.Union or origin is types.UnionType
86
+
87
+
80
88
  def is_optional(field_type: typing.Any) -> bool:
81
- return typing.get_origin(field_type) is typing.Union and type(
82
- None
83
- ) in typing.get_args(field_type)
89
+ return is_union(field_type) and type(None) in typing.get_args(field_type)
84
90
 
85
91
 
86
92
  def is_missing(field_type: typing.Any) -> bool:
87
- origin = typing.get_origin(field_type)
88
- if origin is not typing.Union:
93
+ if not is_union(field_type):
89
94
  return False
90
95
  args = typing.get_args(field_type)
91
96
  return not (len(args) == 0 or args[0] is not MissingSentryType)
92
97
 
93
98
 
94
- def _invoke_tuple_parsers(
99
+ def _invoke_tuple_parsers[T](
95
100
  tuple_type: type[T],
96
101
  arg_parsers: typing.Sequence[typing.Callable[[typing.Any], object]],
97
102
  has_ellipsis: bool,
@@ -128,7 +133,7 @@ def _invoke_fallback_parsers(
128
133
  ) from ExceptionGroup("Fallback Parser Exception", exceptions)
129
134
 
130
135
 
131
- def _invoke_membership_parser(
136
+ def _invoke_membership_parser[T](
132
137
  expected_values: set[T],
133
138
  value: typing.Any,
134
139
  ) -> T:
@@ -143,11 +148,16 @@ def _invoke_membership_parser(
143
148
  raise ValueError(f"Expected value from {expected_values} but got value {value}")
144
149
 
145
150
 
146
- def _build_parser_discriminated_union(
147
- discriminator: str, discriminator_map: dict[str, ParserFunction[T]]
151
+ def _build_parser_discriminated_union[T](
152
+ context: ParserContext,
153
+ discriminator: str,
154
+ discriminator_map: dict[str, ParserFunction[T]],
148
155
  ) -> ParserFunction[T]:
149
156
  def parse(value: typing.Any) -> typing.Any:
150
- discriminant = value.get(discriminator)
157
+ if context.options.allow_direct_dataclass and dataclasses.is_dataclass(value):
158
+ discriminant = getattr(value, discriminator)
159
+ else:
160
+ discriminant = value.get(discriminator)
151
161
  if discriminant is None:
152
162
  raise ValueError("missing-union-discriminant")
153
163
  if not isinstance(discriminant, str):
@@ -160,7 +170,7 @@ def _build_parser_discriminated_union(
160
170
  return parse
161
171
 
162
172
 
163
- def _build_parser_inner(
173
+ def _build_parser_inner[T](
164
174
  parsed_type: type[T],
165
175
  context: ParserContext,
166
176
  ) -> ParserFunction[T]:
@@ -178,6 +188,7 @@ def _build_parser_inner(
178
188
  parsed_type = serial_union.get_union_underlying()
179
189
  else:
180
190
  return _build_parser_discriminated_union(
191
+ context,
181
192
  discriminator,
182
193
  {
183
194
  key: _build_parser_inner(value, context)
@@ -357,7 +368,7 @@ def _build_parser_inner(
357
368
  raise ValueError(f"Unhandled type {parsed_type}")
358
369
 
359
370
 
360
- def _build_parser_dataclass(
371
+ def _build_parser_dataclass[T](
361
372
  parsed_type: type[T],
362
373
  context: ParserContext,
363
374
  ) -> ParserFunction[T]:
@@ -392,21 +403,25 @@ def _build_parser_dataclass(
392
403
  )
393
404
 
394
405
  def parse(value: typing.Any) -> typing.Any:
406
+ # Use an exact type match to prevent base/derived class mismatches
407
+ if context.options.allow_direct_dataclass and type(value) is parsed_type:
408
+ return value
409
+
395
410
  data: dict[typing.Any, typing.Any] = {}
396
411
  for field, field_type, field_parser in dc_field_parsers:
397
412
  field_raw_value = None
398
413
  try:
399
414
  field_raw_value = value.get(
400
415
  resolve_serialized_field_name(field_name=field.name),
401
- MISSING,
416
+ dataclasses.MISSING,
402
417
  )
403
418
  field_value: typing.Any
404
- if field_raw_value == MISSING:
419
+ if field_raw_value == dataclasses.MISSING:
405
420
  if serial_class_data.has_parse_require(field.name):
406
421
  raise ValueError("missing-required-field", field.name)
407
- if field.default != MISSING:
422
+ if field.default != dataclasses.MISSING:
408
423
  field_value = field.default
409
- elif field.default_factory != MISSING:
424
+ elif field.default_factory != dataclasses.MISSING:
410
425
  field_value = field.default_factory()
411
426
  elif is_missing(field_type):
412
427
  field_value = MissingSentryType()
@@ -464,7 +479,7 @@ def _build_parser_dataclass(
464
479
  _CACHE_MAP: dict[ParserOptions, ParserCache] = defaultdict(ParserCache)
465
480
 
466
481
 
467
- def build_parser(
482
+ def build_parser[T](
468
483
  parsed_type: type[T],
469
484
  options: ParserOptions,
470
485
  ) -> ParserFunction[T]:
@@ -486,17 +501,31 @@ def build_parser(
486
501
  return built_parser
487
502
 
488
503
 
489
- class CachedParser(typing.Generic[T]):
504
+ class CachedParser[T]:
490
505
  def __init__(
491
506
  self,
492
507
  args: type[T],
493
508
  strict_property_parsing: bool = False,
494
509
  ):
495
510
  self.arguments = args
496
- self.parser_api: typing.Optional[ParserFunction[T]] = None
497
- self.parser_storage: typing.Optional[ParserFunction[T]] = None
511
+ self.parser_api: ParserFunction[T] | None = None
512
+ self.parser_storage: ParserFunction[T] | None = None
498
513
  self.strict_property_parsing = strict_property_parsing
499
514
 
515
+ def parse_from_encoding(
516
+ self,
517
+ args: typing.Any,
518
+ *,
519
+ source_encoding: SourceEncoding,
520
+ ) -> T:
521
+ match source_encoding:
522
+ case SourceEncoding.API:
523
+ return self.parse_api(args)
524
+ case SourceEncoding.STORAGE:
525
+ return self.parse_storage(args)
526
+ case _:
527
+ typing.assert_never(source_encoding)
528
+
500
529
  def parse_api(self, args: typing.Any) -> T:
501
530
  """
502
531
  Parses data coming from an API/Endpoint
@@ -17,3 +17,4 @@ from .file_type_utils import FileSystemSFTPConfig as FileSystemSFTPConfig
17
17
  from .file_type_utils import FileTransfer as FileTransfer
18
18
  from .file_type_utils import IncompatibleFileReference as IncompatibleFileReference
19
19
  from .file_type_utils import RemoteObjectReference as RemoteObjectReference
20
+ from .filesystem_session import FileSystemSession as FileSystemSession
@@ -1,6 +1,6 @@
1
1
  import os
2
2
  from io import BytesIO
3
- from typing import Any, Optional
3
+ from typing import Any
4
4
 
5
5
  from google.oauth2 import service_account
6
6
  from googleapiclient.discovery import build as build_gdrive_connection
@@ -30,7 +30,7 @@ def download_gdrive_file(
30
30
  mime_type: str,
31
31
  *,
32
32
  verbose: bool = False,
33
- ) -> Optional[FileObjectData]:
33
+ ) -> FileObjectData | None:
34
34
  if "folder" in mime_type:
35
35
  if verbose:
36
36
  print(f"{filename} is a folder and will not be downloaded.")
@@ -148,7 +148,7 @@ def move_gdrive_file(
148
148
  src_file_id: str,
149
149
  dest_folder_id: str,
150
150
  *,
151
- dest_filename: Optional[str] = None,
151
+ dest_filename: str | None = None,
152
152
  ) -> None:
153
153
  # Retrieve the existing parents to remove
154
154
  file = (
@@ -197,7 +197,7 @@ class GDriveSession(FileSystemSession):
197
197
  dir_path: FileSystemObject,
198
198
  *,
199
199
  recursive: bool = False,
200
- valid_file_extensions: Optional[tuple[str, ...]] = None,
200
+ valid_file_extensions: tuple[str, ...] | None = None,
201
201
  ) -> list[FileSystemObject]:
202
202
  if not isinstance(dir_path, RemoteObjectReference):
203
203
  raise IncompatibleFileReference(
@@ -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()
@@ -1,7 +1,6 @@
1
1
  import os
2
2
  from collections.abc import Iterable
3
3
  from io import BytesIO
4
- from typing import Optional
5
4
 
6
5
  import paramiko
7
6
  import pysftp
@@ -30,8 +29,8 @@ def list_sftp_files(
30
29
  connection: pysftp.Connection,
31
30
  dir_path: str,
32
31
  *,
33
- valid_extensions: Optional[Iterable[str]] = None,
34
- parent_dir_path: Optional[str] = None,
32
+ valid_extensions: Iterable[str] | None = None,
33
+ parent_dir_path: str | None = None,
35
34
  recursive: bool = True,
36
35
  ) -> list[str]:
37
36
  file_paths: list[str] = []