UncountablePythonSDK 0.0.39__py3-none-any.whl → 0.0.41__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 (136) hide show
  1. {UncountablePythonSDK-0.0.39.dist-info → UncountablePythonSDK-0.0.41.dist-info}/METADATA +1 -1
  2. UncountablePythonSDK-0.0.41.dist-info/RECORD +223 -0
  3. {UncountablePythonSDK-0.0.39.dist-info → UncountablePythonSDK-0.0.41.dist-info}/WHEEL +1 -1
  4. pkgs/argument_parser/argument_parser.py +1 -1
  5. pkgs/serialization/yaml.py +54 -0
  6. pkgs/type_spec/config.py +1 -13
  7. pkgs/type_spec/emit_open_api.py +3 -3
  8. pkgs/type_spec/emit_python.py +40 -7
  9. pkgs/type_spec/load_types.py +2 -1
  10. pkgs/type_spec/type_info/emit_type_info.py +1 -1
  11. pkgs/type_spec/value_spec/__main__.py +1 -1
  12. uncountable/integration/cron.py +2 -0
  13. uncountable/integration/entrypoint.py +5 -6
  14. uncountable/integration/job.py +1 -1
  15. uncountable/types/__init__.py +29 -29
  16. uncountable/types/api/batch/execute_batch.py +1 -1
  17. uncountable/types/api/batch/execute_batch_load_async.py +2 -2
  18. uncountable/types/api/chemical/convert_chemical_formats.py +1 -1
  19. uncountable/types/api/entity/create_entities.py +3 -3
  20. uncountable/types/api/entity/create_entity.py +3 -3
  21. uncountable/types/api/entity/get_entities_data.py +3 -3
  22. uncountable/types/api/entity/list_entities.py +2 -2
  23. uncountable/types/api/entity/lock_entity.py +3 -3
  24. uncountable/types/api/entity/resolve_entity_ids.py +2 -2
  25. uncountable/types/api/entity/set_values.py +3 -3
  26. uncountable/types/api/entity/transition_entity_phase.py +3 -3
  27. uncountable/types/api/entity/unlock_entity.py +3 -3
  28. uncountable/types/api/equipment/associate_equipment_input.py +3 -3
  29. uncountable/types/api/field_options/upsert_field_options.py +1 -1
  30. uncountable/types/api/id_source/list_id_source.py +2 -2
  31. uncountable/types/api/id_source/match_id_source.py +2 -2
  32. uncountable/types/api/input_groups/get_input_group_names.py +1 -1
  33. uncountable/types/api/inputs/create_inputs.py +3 -3
  34. uncountable/types/api/inputs/get_input_data.py +2 -2
  35. uncountable/types/api/inputs/get_input_names.py +1 -1
  36. uncountable/types/api/inputs/get_inputs_data.py +2 -2
  37. uncountable/types/api/inputs/set_input_attribute_values.py +2 -2
  38. uncountable/types/api/inputs/set_input_category.py +2 -2
  39. uncountable/types/api/inputs/set_input_subcategories.py +3 -3
  40. uncountable/types/api/inputs/set_intermediate_type.py +1 -1
  41. uncountable/types/api/material_families/update_entity_material_families.py +5 -5
  42. uncountable/types/api/outputs/get_output_data.py +2 -2
  43. uncountable/types/api/outputs/get_output_names.py +1 -1
  44. uncountable/types/api/outputs/resolve_output_conditions.py +1 -1
  45. uncountable/types/api/permissions/set_core_permissions.py +3 -3
  46. uncountable/types/api/project/get_projects.py +2 -2
  47. uncountable/types/api/project/get_projects_data.py +4 -4
  48. uncountable/types/api/recipe_links/create_recipe_link.py +3 -3
  49. uncountable/types/api/recipe_links/remove_recipe_link.py +3 -3
  50. uncountable/types/api/recipe_metadata/get_recipe_metadata_data.py +1 -1
  51. uncountable/types/api/recipes/add_recipe_to_project.py +1 -1
  52. uncountable/types/api/recipes/archive_recipes.py +1 -1
  53. uncountable/types/api/recipes/associate_recipe_as_input.py +2 -2
  54. uncountable/types/api/recipes/associate_recipe_as_lot.py +2 -2
  55. uncountable/types/api/recipes/create_recipe.py +4 -4
  56. uncountable/types/api/recipes/create_recipes.py +2 -2
  57. uncountable/types/api/recipes/disassociate_recipe_as_input.py +2 -2
  58. uncountable/types/api/recipes/edit_recipe_inputs.py +3 -3
  59. uncountable/types/api/recipes/get_curve.py +2 -2
  60. uncountable/types/api/recipes/get_recipe_calculations.py +2 -2
  61. uncountable/types/api/recipes/get_recipe_links.py +2 -2
  62. uncountable/types/api/recipes/get_recipe_names.py +1 -1
  63. uncountable/types/api/recipes/get_recipe_output_metadata.py +2 -2
  64. uncountable/types/api/recipes/get_recipes_data.py +7 -7
  65. uncountable/types/api/recipes/lock_recipes.py +1 -1
  66. uncountable/types/api/recipes/remove_recipe_from_project.py +1 -1
  67. uncountable/types/api/recipes/set_recipe_inputs.py +1 -1
  68. uncountable/types/api/recipes/set_recipe_metadata.py +2 -2
  69. uncountable/types/api/recipes/set_recipe_output_annotations.py +2 -2
  70. uncountable/types/api/recipes/set_recipe_outputs.py +3 -3
  71. uncountable/types/api/recipes/set_recipe_tags.py +2 -2
  72. uncountable/types/api/recipes/unarchive_recipes.py +1 -1
  73. uncountable/types/api/recipes/unlock_recipes.py +1 -1
  74. uncountable/types/api/triggers/run_trigger.py +2 -2
  75. uncountable/types/async_batch.py +5 -53
  76. uncountable/types/async_batch_processor.py +6 -6
  77. uncountable/types/async_batch_t.py +59 -0
  78. uncountable/types/base.py +4 -78
  79. uncountable/types/base_t.py +85 -0
  80. uncountable/types/calculations.py +2 -17
  81. uncountable/types/calculations_t.py +23 -0
  82. uncountable/types/chemical_structure.py +2 -21
  83. uncountable/types/chemical_structure_t.py +27 -0
  84. uncountable/types/client_base.py +12 -12
  85. uncountable/types/curves.py +4 -41
  86. uncountable/types/curves_t.py +47 -0
  87. uncountable/types/entity.py +3 -268
  88. uncountable/types/entity_t.py +274 -0
  89. uncountable/types/experiment_groups.py +2 -17
  90. uncountable/types/experiment_groups_t.py +23 -0
  91. uncountable/types/field_values.py +5 -59
  92. uncountable/types/field_values_t.py +65 -0
  93. uncountable/types/fields.py +2 -18
  94. uncountable/types/fields_t.py +24 -0
  95. uncountable/types/id_source.py +6 -43
  96. uncountable/types/id_source_t.py +49 -0
  97. uncountable/types/identifier.py +5 -48
  98. uncountable/types/identifier_t.py +54 -0
  99. uncountable/types/input_attributes.py +2 -23
  100. uncountable/types/input_attributes_t.py +29 -0
  101. uncountable/types/inputs.py +4 -56
  102. uncountable/types/inputs_t.py +62 -0
  103. uncountable/types/outputs.py +2 -20
  104. uncountable/types/outputs_t.py +26 -0
  105. uncountable/types/permissions.py +2 -40
  106. uncountable/types/permissions_t.py +46 -0
  107. uncountable/types/phases.py +2 -17
  108. uncountable/types/phases_t.py +23 -0
  109. uncountable/types/post_base.py +2 -24
  110. uncountable/types/post_base_t.py +30 -0
  111. uncountable/types/recipe_identifiers.py +6 -56
  112. uncountable/types/recipe_identifiers_t.py +62 -0
  113. uncountable/types/recipe_inputs.py +3 -24
  114. uncountable/types/recipe_inputs_t.py +30 -0
  115. uncountable/types/recipe_links.py +3 -44
  116. uncountable/types/recipe_links_t.py +50 -0
  117. uncountable/types/recipe_metadata.py +4 -46
  118. uncountable/types/recipe_metadata_t.py +52 -0
  119. uncountable/types/recipe_output_metadata.py +2 -18
  120. uncountable/types/recipe_output_metadata_t.py +24 -0
  121. uncountable/types/recipe_tags.py +2 -17
  122. uncountable/types/recipe_tags_t.py +23 -0
  123. uncountable/types/recipe_workflow_steps.py +8 -82
  124. uncountable/types/recipe_workflow_steps_t.py +88 -0
  125. uncountable/types/recipes.py +2 -15
  126. uncountable/types/recipes_t.py +21 -0
  127. uncountable/types/response.py +2 -19
  128. uncountable/types/response_t.py +25 -0
  129. uncountable/types/units.py +2 -17
  130. uncountable/types/units_t.py +23 -0
  131. uncountable/types/users.py +2 -18
  132. uncountable/types/users_t.py +24 -0
  133. uncountable/types/workflows.py +3 -26
  134. uncountable/types/workflows_t.py +32 -0
  135. UncountablePythonSDK-0.0.39.dist-info/RECORD +0 -193
  136. {UncountablePythonSDK-0.0.39.dist-info → UncountablePythonSDK-0.0.41.dist-info}/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: UncountablePythonSDK
3
- Version: 0.0.39
3
+ Version: 0.0.41
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,223 @@
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=NnB0-jOOufUvD3q1csl7WvQ8oHOD-5emqp_SWUXExI0,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=CffQ8O9drJ-Mdd6S5DnMIOBsHv5aVkTZrD3l3xBnB4s,1094
18
+ examples/create_entity.py,sha256=noZdtJ5f9Wfiob3zUH-8bDVbrCPJnFtXFk_W9pSjvUA,664
19
+ examples/edit_recipe_inputs.py,sha256=f1zpK2T00JNQdbh7R01Sns1D_3TTgj-u8-YInoczRX8,1541
20
+ examples/upload_files.py,sha256=tUfKFqiqwnw08OL5Y8_e4j5pSRhp94cFex8XTuVa_ig,487
21
+ pkgs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
22
+ pkgs/argument_parser/__init__.py,sha256=CsQ6QoPKSLLRVl-z6URAmPkiUL9ZPZoV4rJHgy_-RjA,385
23
+ pkgs/argument_parser/_is_enum.py,sha256=Gw6jJa8nBwYGqXwwCZbSnWL8Rvr5alkg5lSVAqXtOZM,257
24
+ pkgs/argument_parser/_is_namedtuple.py,sha256=Rjc1bKanIPPogl3qG5JPBxglG1TqWYOo1nxxhBASQWY,265
25
+ pkgs/argument_parser/argument_parser.py,sha256=wNGidf80hO0PrPq2zC6NPQXm3Ia_qbrhlsiCXtGIETY,17272
26
+ pkgs/argument_parser/case_convert.py,sha256=NuJLJUJRbyVb6_Slen4uqaStEHbcOS1d-hBBfDrrw-c,605
27
+ pkgs/serialization/__init__.py,sha256=LifasRW0a50A3qRFmo2bf3FQ6TXhZWOTz2-CVTgPjcQ,753
28
+ pkgs/serialization/missing_sentry.py,sha256=aM_9KxbCk9dVvXvcOKgkIQBqFWvLhv8QlIUCiuFEXMo,806
29
+ pkgs/serialization/opaque_key.py,sha256=FIfXEE0DA1U8R_taFbQ1RCoTSgehrPjP06-qvo-GeNQ,177
30
+ pkgs/serialization/serial_class.py,sha256=r0hrQdIbJA_X0W0_jKEVrxi_JzVRT9qHCjsUgGu3cCI,5290
31
+ pkgs/serialization/serial_union.py,sha256=z8Ptj4bVHyb1ROfg0UPTwZ6Ef6iXLr0YJfAH5o_PU9A,2601
32
+ pkgs/serialization/yaml.py,sha256=t-31FS0pL1YbhfspK88iQEGa1WDn60Fw16CpoLSClJM,1453
33
+ pkgs/serialization_util/__init__.py,sha256=MVKqHTUl2YnWZAFG9xCxu1SgmkQ5xPofrAGlYg6h7rI,330
34
+ pkgs/serialization_util/_get_type_for_serialization.py,sha256=dW5_W9MFd6wgWfW5qlWork-GBb-QFLtiOZkjk2Zqn2M,1177
35
+ pkgs/serialization_util/convert_to_snakecase.py,sha256=H2BAo5ZdcCDN77RpLb-uP0s7-FQ5Ukwnsd3VYc1vD0M,583
36
+ pkgs/serialization_util/serialization_helpers.py,sha256=B8W82-KT10nQYmDk5uhAqB5QNS-dsxzXMFhtTmooMqw,6365
37
+ pkgs/strenum_compat/__init__.py,sha256=wXRFeNvBm8RU6dy1PFJ5sRLgUIEeH_DVR95Sv5qpGbk,59
38
+ pkgs/strenum_compat/strenum_compat.py,sha256=uOUAgpYTjHs1MX8dG81jRlyTkt3KNbkV_25zp7xTX2s,36
39
+ pkgs/type_spec/__init__.py,sha256=h5DmJTca4QVV10sZR1x0-MlkZfuGYDfapR3zHvXfzto,19
40
+ pkgs/type_spec/__main__.py,sha256=5bJaX9Y_-FavP0qwzhk-z-V97UY7uaezJTa1zhO_HHQ,1048
41
+ pkgs/type_spec/builder.py,sha256=xQcY2HcQTI2FSOMycgx3yD23_Oz3_LfWdyW65pDaHoc,46667
42
+ pkgs/type_spec/config.py,sha256=IQyo2Vj11uNt7_d6jQxvominAOU-oPB8ldEmuGzJLpU,4644
43
+ pkgs/type_spec/emit_io_ts.py,sha256=Ghd8XYqyNYldHQDepwa9GLfHXcoi48ztBw84K28ETic,5707
44
+ pkgs/type_spec/emit_open_api.py,sha256=8BTZpiQlD628WoFsjDVzRdmM0ZBfMP19QSJOOcdZoLQ,24397
45
+ pkgs/type_spec/emit_open_api_util.py,sha256=9tWLMT6NTeCa2caO8DdWo6aYoi0b4AEFiAXNaaQKJIs,2373
46
+ pkgs/type_spec/emit_python.py,sha256=djF_nUs0v3c5NI8BJjOj0gbLtf_PgbMgk5CCgvh2aPg,46469
47
+ pkgs/type_spec/emit_typescript.py,sha256=cdr5h8N70PuwORcvhURUujzwH9r1LVwJB8V2EoipGkw,17917
48
+ pkgs/type_spec/emit_typescript_util.py,sha256=sR7ys3Ilnh6SQiXJbfYk4pxfOu0bDjbUFTEYEW-ud6c,863
49
+ pkgs/type_spec/load_types.py,sha256=BOLyndtxPqqhUqZAh-lIbN5IZBaW_m-bdYpKGsbPyXM,3654
50
+ pkgs/type_spec/open_api_util.py,sha256=IGh-_snGPST_P_8FdYtO8MTEa9PUxRW6Rzg9X9EgQik,7114
51
+ pkgs/type_spec/test.py,sha256=4ueujBq-pEgnX3Z69HyPmD-bullFXmpixcpVzfOkhP4,489
52
+ pkgs/type_spec/util.py,sha256=6m6MPfY-SwjyZf2FWQKclswWB5o7gcdd-3tdpViPYOQ,4844
53
+ pkgs/type_spec/actions_registry/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
54
+ pkgs/type_spec/actions_registry/__main__.py,sha256=JGwKxcAmrQdbpVR2vwknoimN1Q-r5h4SADw1cYLYzgk,4331
55
+ pkgs/type_spec/actions_registry/emit_typescript.py,sha256=ben0W7qwaVCzLO-t3NEJPPNGEE_6sKLdJMuAh8aMBnw,6044
56
+ pkgs/type_spec/parts/base.py.prepart,sha256=wGNoDyQnLolHRZGRwHQX5TrPfKnu558NXCocYvqyroc,2174
57
+ pkgs/type_spec/parts/base.ts.prepart,sha256=2FJJvpg2olCcavxj0nbYWdwKl6KeScour2JjSvN42l8,1001
58
+ pkgs/type_spec/type_info/__main__.py,sha256=pmVjVqXyVh8vKTNCTFgz80Sg74C5BKToP3E6GS-X_So,857
59
+ pkgs/type_spec/type_info/emit_type_info.py,sha256=7FtMm_WOhxoT8Hy2DDorexIccwCNVZ9mJTBURD8l9Rk,13282
60
+ pkgs/type_spec/value_spec/__init__.py,sha256=Z-grlcZtxAfEXhPHsK0nD7PFLGsv4eqvunaPN7_TA84,83
61
+ pkgs/type_spec/value_spec/__main__.py,sha256=6bzP85p_Cm4bPp5tXz8D_4p64wMn5SKsXC7SqSZquYc,8318
62
+ pkgs/type_spec/value_spec/convert_type.py,sha256=SAYyEV6orQJJbkXSE4hhtOQJ2vKUXJCKPeYPrB8G9oA,2272
63
+ pkgs/type_spec/value_spec/emit_python.py,sha256=rjg6LIGYdaagrZ19XpDfW_Z7LPNwCMDceBje5dsMFbw,6959
64
+ pkgs/type_spec/value_spec/types.py,sha256=a2zxbbCRWepY1l8OtjeCDKgBKFPFHVgV99oP6pTtaro,441
65
+ uncountable/__init__.py,sha256=8l8XWNCKsu7TG94c-xa2KHpDegvxDC2FyQISdWC763Y,89
66
+ uncountable/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
67
+ uncountable/core/__init__.py,sha256=RFv0kO6rKFf1PtBPu83hCGmxqkJamRtsgQ9_-ztw7tA,341
68
+ uncountable/core/async_batch.py,sha256=Zo02TICZ7AK81Qa02NQ8fp8uaijQph1FEta28K3cKb0,749
69
+ uncountable/core/client.py,sha256=50vR11GwwyTc3qOIahUxCJK77zCM7LOXwbZdHoZCZgY,10168
70
+ uncountable/core/file_upload.py,sha256=t4cutIFB5rNN2qVCx3H0HotSjCSJSxis2_QBarDuXyc,2833
71
+ uncountable/core/types.py,sha256=s2CjqYJpsmbC7xMwxxT7kJ_V9bwokrjjWVVjpMcQpKI,333
72
+ uncountable/integration/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
73
+ uncountable/integration/construct_client.py,sha256=N3K-wck7teqvHTrOh0N2bGF3u6kyuwQvgo7gsKLihQ0,1077
74
+ uncountable/integration/cron.py,sha256=JIBgHUi4BqUULEPwYCZlDsvdJXLtl-EgCt7RVIdVmSE,995
75
+ uncountable/integration/entrypoint.py,sha256=zpYd1mzbc7uZ68IyXIkODqKPvzsUZ_3Lkj2H2bhKor0,1377
76
+ uncountable/integration/job.py,sha256=Cy10LUfy2HaGcVz0uH7I00WeyyFYKYgEd-rE_OqVkUc,819
77
+ uncountable/integration/server.py,sha256=5Wh80VyfgUUHA5NiFGn9LjS4KJ9zJz3QbNTLLKhFAso,3342
78
+ uncountable/integration/types.py,sha256=n9idu2_qHOA5CQdE6NK8HS6aZ8ugTZKTfTTnm4sy8tI,2066
79
+ uncountable/integration/db/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
80
+ uncountable/integration/db/connect.py,sha256=YtQHJ1DBGPhxKFRCfiXqohOYUceKSxMVOJ88aPI48Ug,181
81
+ uncountable/integration/executors/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
82
+ uncountable/integration/executors/script_executor.py,sha256=hM8E-aU8zyM6ZcBtqAqInKZ_BF93RLqEA0dU7y5FhWQ,841
83
+ uncountable/types/__init__.py,sha256=7Mh5hhEpY2w33Wp8SfUc2fbvyDk_DvuK9oZFWol07dc,7771
84
+ uncountable/types/async_batch.py,sha256=ihCv5XWSTTPmuO-GMPn1EACGI2CBUIJTATZ3aPgsNBA,523
85
+ uncountable/types/async_batch_processor.py,sha256=wqwEe6L0_YdcldljZi6aaunYJTbNwYqo2rC5r_nxfvM,7368
86
+ uncountable/types/async_batch_t.py,sha256=UJ-9vkTCJjY5QNS9Us0F-_swD1as80s9xztyJzwPdmI,1773
87
+ uncountable/types/base.py,sha256=xVSjWvA_fUUnkCg83EjoYEFvAfmskinKFMeYFOxNc9E,359
88
+ uncountable/types/base_t.py,sha256=XXjZXexx0xWFUxMMhW8i9nIL6n8dsZVsHwdgnhZ0zJ4,2714
89
+ uncountable/types/calculations.py,sha256=FFO_D3BbKoGDZnqWvTKpW4KF359i2vrKjpdFCLYzJC0,284
90
+ uncountable/types/calculations_t.py,sha256=C2LlGVtVFhAo3uXK8LTXb36890nYIjfaL21goQA6YcU,559
91
+ uncountable/types/chemical_structure.py,sha256=E-LnikTFDoVQ1b2zKaVUIO_PAKm-7aZZYJi8I8SDSic,302
92
+ uncountable/types/chemical_structure_t.py,sha256=Qfeq0Iwgvd0Jq42fSsa5TPeeL_nH0FOctbmLGBlZqY4,763
93
+ uncountable/types/client_base.py,sha256=FMXVJZDoMZhUu0pjsuHg-wn7cDCFtgoYDVFd8A9L5rs,64358
94
+ uncountable/types/curves.py,sha256=W6uMpG5SyW1MS82szNpxkFEn1MnxNpBFyFbQb2Ysfng,366
95
+ uncountable/types/curves_t.py,sha256=D-7CRBxnx13-CURb2PyhYC-heHyb766zp1Dl8gb8fI0,1305
96
+ uncountable/types/entity.py,sha256=3XhLteFDRDZvHejDuYh-KvB65hpwrBygljFfiUcOAM8,315
97
+ uncountable/types/entity_t.py,sha256=zwm0YAEfO2Nk5cAOZIltTNguncU2W_E6Y194z6cmxis,11634
98
+ uncountable/types/experiment_groups.py,sha256=_0OXcPzSAbkE-rfKt5tPx178YJ4pcEKZvrCxUHgDnvw,309
99
+ uncountable/types/experiment_groups_t.py,sha256=O5Ae5J7QpY-UCJtVyFklzy2j4H7G9C_GI9gPuG7u4Ro,596
100
+ uncountable/types/field_values.py,sha256=uuIWX-xmfvcinYPdfkWJeb56zzQY01mc9rmotMPMh24,503
101
+ uncountable/types/field_values_t.py,sha256=E1bAGQ1CeKIJWSvRte-vBfVYU78FjMhPo_0FZyXMpec,1667
102
+ uncountable/types/fields.py,sha256=GUY5ne8Zp2_Lalikr0zcbdJrin8dG81eyS8fKWJ9yf8,266
103
+ uncountable/types/fields_t.py,sha256=r2voMUbJ_NNLTqLpoTlroJFz5ZtRs8Uicfk2VRnKPls,567
104
+ uncountable/types/id_source.py,sha256=wGLA0fMl-5IqBG_fg2UDC7fY-8CWRBNFJOokejOoN_w,567
105
+ uncountable/types/id_source_t.py,sha256=nboOaYjzN4WPaepfAiuGUXAc-PrIp319BXBmOyfBA9E,1336
106
+ uncountable/types/identifier.py,sha256=6ziONd__L07ijhVwpIehUUDvxgKTtHbunk-6CivJqxQ,503
107
+ uncountable/types/identifier_t.py,sha256=KwdB4TJco_ygq8UgI50XgBB3CR7xOBu_zxQs1qJlnII,1452
108
+ uncountable/types/input_attributes.py,sha256=IrIKQnHqHdS1Utdfzr9GnOe17a8riaqYcO1r0nvtkvA,304
109
+ uncountable/types/input_attributes_t.py,sha256=vfTexLpntWRQV8KLRyw_ihdvk-rL_guqGeuIpiq2QrI,823
110
+ uncountable/types/inputs.py,sha256=6RIEFfCxLqpeHEGOpu63O4i8zPogjGeB7wiV_rPBw_g,404
111
+ uncountable/types/inputs_t.py,sha256=4Xgm807Fl8AXr76jJT1cHjqOKHkhP2KcDqPhaAS7X7Y,1614
112
+ uncountable/types/outputs.py,sha256=sUZx_X-TKCZtLm1YCEH8OISX9DdPlv9ZuUfM3-askCc,281
113
+ uncountable/types/outputs_t.py,sha256=35T97zdbKOXj_63nOeICuictV0Txq6vB5rVw__4aF8E,659
114
+ uncountable/types/permissions.py,sha256=1mRnSsmRgjuLgp6pylTwwACD_YRIcmlqxHkufwZtMns,297
115
+ uncountable/types/permissions_t.py,sha256=i0vFwVvmmnInrA5qW8uuo0_tM6KYn3VYZ75d9084Vko,1625
116
+ uncountable/types/phases.py,sha256=YCsU77DdjRJJWdLTwLuOZNG4e9ML82NIBI1xTWr3ggA,266
117
+ uncountable/types/phases_t.py,sha256=uC4-16UzWVrywTTz8YBkLsiRaxS69s5ft89hZNGUzsE,547
118
+ uncountable/types/post_base.py,sha256=GES5_IhXFAjpzI6ChbVP4zTkX6f3tPUIHST1sxsRN6Q,279
119
+ uncountable/types/post_base_t.py,sha256=2et3TDnFChZcx0RWU-18RJHw9Yiyj2TJz-2tByHXwaI,770
120
+ uncountable/types/recipe_identifiers.py,sha256=Pi5KX64kzoBp_t_tjb3uVk9Ef1WPIIXGtUdINXi5vcY,654
121
+ uncountable/types/recipe_identifiers_t.py,sha256=zt3OK0aqoIl0jMgvZH8vFe_L4vsAue0Bn44NMbBJgUE,1765
122
+ uncountable/types/recipe_inputs.py,sha256=5ThNFEOGbADqqfj1V3hNvZUcO5pn1Gm17LmzQkWDrtI,351
123
+ uncountable/types/recipe_inputs_t.py,sha256=t5nFzuF1AU6SUHpya6xKHSlcckmt3XxAuk9ofjZ2oGU,746
124
+ uncountable/types/recipe_links.py,sha256=YRiu6t7FWr7ZWycIaOPXBtQFqbY_q5unaP6KQzh1LzE,343
125
+ uncountable/types/recipe_links_t.py,sha256=7Pai7fWuu5iGcHBDfDflkhj6L4MPCe9G0uER6KrsmRU,1403
126
+ uncountable/types/recipe_metadata.py,sha256=Zpcrupq_mlT2UhXpMJup5XjtubmvgZ8SbJNq7da2pCs,441
127
+ uncountable/types/recipe_metadata_t.py,sha256=JDi3AJkwRF9sgu9gvPtLy9xMixX8BM1QpiZdZHdRXF4,1434
128
+ uncountable/types/recipe_output_metadata.py,sha256=83jKZCvogG9QjZeJpQptdSam_MnnUj-tqh9EVIrTWjE,322
129
+ uncountable/types/recipe_output_metadata_t.py,sha256=PYDXH1i6-W53vqj9qy_1QXeHX6m7cmkmKGCWnM8GHfk,610
130
+ uncountable/types/recipe_tags.py,sha256=eyYa_rox00a1JQ0lOQv9STnJI04ksCL_3kHSDx5w7rM,291
131
+ uncountable/types/recipe_tags_t.py,sha256=cdn0cuHQtn3l5WQXt8rydgjYkYbhhcGyepeB-So9jhE,578
132
+ uncountable/types/recipe_workflow_steps.py,sha256=-s1sOXMny4kcqT8K_vQRbKjc1Hs855A_e9ZZejDRvN4,971
133
+ uncountable/types/recipe_workflow_steps_t.py,sha256=6dQWjZh4vxhDwa8sXcdlePYMqFwxEXTJl_IZOrwUZp0,2988
134
+ uncountable/types/recipes.py,sha256=1ifutxUN-Blv_vcwMx6DKT47My5pJTG1cwqsMqKK7LY,307
135
+ uncountable/types/recipes_t.py,sha256=U1QxgZPGDYM7HfTm7Y401-FvAh5VPigd9b34b-3kQTA,554
136
+ uncountable/types/response.py,sha256=WOlSgQYKK_fnnXk1i-h3Bwx2ZiYqpLj-lnt-hXhmbWs,274
137
+ uncountable/types/response_t.py,sha256=1vSfw7u5k5vrbQFQbVrT3JU7vkOHa86jY5T0kGVaHvY,625
138
+ uncountable/types/units.py,sha256=R_TBhxWCIWSSXK9J3S0Omtj3t5BZNK9C80MyqFjMO7k,275
139
+ uncountable/types/units_t.py,sha256=mRBkBY4u1Fko5kFhoonUp4XlwHxoUlMv_v2o727AsOs,562
140
+ uncountable/types/users.py,sha256=YEk8v0vDOBFvmOQMQw7MAOicSGzMui8Hb9hdFX2Vw3E,275
141
+ uncountable/types/users_t.py,sha256=GchFvllFynlbEDpXE_Kt5LmNu_hGfI-G1lcNjhICpgo,585
142
+ uncountable/types/workflows.py,sha256=uSZWsdDe2jpXnBnRunEen7_7pbKBrE0ds_ez98EzyPg,353
143
+ uncountable/types/workflows_t.py,sha256=bCyv0lrKutEQ7ltoUFh-PDbgCbxTk1I-gIY05jbHv_4,822
144
+ uncountable/types/api/__init__.py,sha256=gCgbynxG3jA8FQHzercKtrHKHkiIKr8APdZYUniAor8,55
145
+ uncountable/types/api/batch/__init__.py,sha256=gCgbynxG3jA8FQHzercKtrHKHkiIKr8APdZYUniAor8,55
146
+ uncountable/types/api/batch/execute_batch.py,sha256=uLpxq9eUTadDaIDe6NhIk9aXyW0FAlEYleSak6rC8hs,1693
147
+ uncountable/types/api/batch/execute_batch_load_async.py,sha256=xBPageO2rDSpZcyyF-e34DWls08BnFJeKPMAH9RfROc,867
148
+ uncountable/types/api/chemical/__init__.py,sha256=gCgbynxG3jA8FQHzercKtrHKHkiIKr8APdZYUniAor8,55
149
+ uncountable/types/api/chemical/convert_chemical_formats.py,sha256=vVw4RbR8ueEwW97kQr9MIr-srU7Qj38PnkI_5fElAXM,1302
150
+ uncountable/types/api/entity/__init__.py,sha256=gCgbynxG3jA8FQHzercKtrHKHkiIKr8APdZYUniAor8,55
151
+ uncountable/types/api/entity/create_entities.py,sha256=3e00ZPoMOHoXZVfXreBLsia5R50LJxD5tS7XpVJ576Y,1674
152
+ uncountable/types/api/entity/create_entity.py,sha256=OeG8BMPtlV529bZi3qcYeojDppuASs0J6LRncmXxrfE,1844
153
+ uncountable/types/api/entity/get_entities_data.py,sha256=O0D5MK6antWUZUaTLn10Q89iE-fpc7Earvr47obpp2A,1141
154
+ uncountable/types/api/entity/list_entities.py,sha256=GhLqLdXbdJvF5bmhpZuCUiKsxM6J66HXqy-1QJJoBXY,1684
155
+ uncountable/types/api/entity/lock_entity.py,sha256=LIJFVBQrrmf3ts09oN-V6_2MnVi2dXXd5WVRR2iaotY,995
156
+ uncountable/types/api/entity/resolve_entity_ids.py,sha256=hNYBk_ne_s3xVvQZ02Z8-V8BCbp3G5Eg0NZRWDfNUck,1073
157
+ uncountable/types/api/entity/set_values.py,sha256=NgsI7m7BMifmiFS0XSBaU5a1AG-X86bCz4DwAHvINBg,925
158
+ uncountable/types/api/entity/transition_entity_phase.py,sha256=_QiWEiOeCNnSX1YFdSqeAHYWEOEeM4-A6jHB59XaHvo,1772
159
+ uncountable/types/api/entity/unlock_entity.py,sha256=dNZAPCbi8JpB7wCUJQWxwz0k1yBgZeqdCu9Vajio3PY,944
160
+ uncountable/types/api/equipment/__init__.py,sha256=gCgbynxG3jA8FQHzercKtrHKHkiIKr8APdZYUniAor8,55
161
+ uncountable/types/api/equipment/associate_equipment_input.py,sha256=zurlH3QJaUHmruSSfi1XjXLMNQeSkkbPScAyiEOgyf8,961
162
+ uncountable/types/api/field_options/__init__.py,sha256=gCgbynxG3jA8FQHzercKtrHKHkiIKr8APdZYUniAor8,55
163
+ uncountable/types/api/field_options/upsert_field_options.py,sha256=kRezpWqVA7mrCOXt1KufeTHbRrIQEewpY5BXDSlJz70,1135
164
+ uncountable/types/api/id_source/__init__.py,sha256=gCgbynxG3jA8FQHzercKtrHKHkiIKr8APdZYUniAor8,55
165
+ uncountable/types/api/id_source/list_id_source.py,sha256=zTThlQkB6Rai2t4V4qAJX9I_SmnzA6JJSF8FnItGZeA,1141
166
+ uncountable/types/api/id_source/match_id_source.py,sha256=p016NJhx7N9qb5lWYiE-bkXvlJVqiAOArxS4ZJQoAfs,1032
167
+ uncountable/types/api/input_groups/__init__.py,sha256=gCgbynxG3jA8FQHzercKtrHKHkiIKr8APdZYUniAor8,55
168
+ uncountable/types/api/input_groups/get_input_group_names.py,sha256=3Xnug0sz4Rd9Pp34lr6I_VRQ_k7Na_aFfU4lsTw91K0,1030
169
+ uncountable/types/api/inputs/__init__.py,sha256=gCgbynxG3jA8FQHzercKtrHKHkiIKr8APdZYUniAor8,55
170
+ uncountable/types/api/inputs/create_inputs.py,sha256=LJVwafoi4dShjNW2TH8AgMY78Y0q-n1WRsfk70qAUPg,1642
171
+ uncountable/types/api/inputs/get_input_data.py,sha256=t4ab7T7FBuM16IYaOuqbl9zVHWhSQf5rlFxUTzf74Ik,2155
172
+ uncountable/types/api/inputs/get_input_names.py,sha256=gCYigBacSWU1EHY7PyDML_iX5zKTHIXsAYOLO0-Hy_I,1150
173
+ uncountable/types/api/inputs/get_inputs_data.py,sha256=Ujkl3N5va3cVFZ_cmumBQ0Gu7DM0pCnb8bxdaywGhKU,1818
174
+ uncountable/types/api/inputs/set_input_attribute_values.py,sha256=dFvpKm1bJjGXWXUdsbSgkQcIzoJBLAG4OIkq5a7lWaY,1326
175
+ uncountable/types/api/inputs/set_input_category.py,sha256=bSFF5Ix-s8rymKGsmgPM17pArbG9ibsbdjID6TCRL84,946
176
+ uncountable/types/api/inputs/set_input_subcategories.py,sha256=2FlLg7kEhyQa9eEV8gcExODNQduLhROPnsdwafsL9FA,970
177
+ uncountable/types/api/inputs/set_intermediate_type.py,sha256=TPpVIwLtYQdfcm80E9nWmkts4KsD819phDqFJJF4gVE,1100
178
+ uncountable/types/api/material_families/__init__.py,sha256=gCgbynxG3jA8FQHzercKtrHKHkiIKr8APdZYUniAor8,55
179
+ uncountable/types/api/material_families/update_entity_material_families.py,sha256=GOtVMYNCqqYrOI2hZ8z4x5mxonOZmG62OBulaQqoz4U,1344
180
+ uncountable/types/api/outputs/__init__.py,sha256=gCgbynxG3jA8FQHzercKtrHKHkiIKr8APdZYUniAor8,55
181
+ uncountable/types/api/outputs/get_output_data.py,sha256=3sfB0YxJhfsLfqTXss5jL6XVtd_iiULl29qo1jfcIoI,2228
182
+ uncountable/types/api/outputs/get_output_names.py,sha256=lQcEPVJRa6graVTqLmBj_UZzM6j8aOAN-s_XOgzD5VA,1083
183
+ uncountable/types/api/outputs/resolve_output_conditions.py,sha256=OhdiCTjxizgjHZFuzCiN1icAMrjoZ3GI2A3MNneiNww,1796
184
+ uncountable/types/api/permissions/__init__.py,sha256=gCgbynxG3jA8FQHzercKtrHKHkiIKr8APdZYUniAor8,55
185
+ uncountable/types/api/permissions/set_core_permissions.py,sha256=qEkhk4TTwzl8IkMKSy8sppUTTTo4d-1NhZ6c3xi1vf4,2513
186
+ uncountable/types/api/project/__init__.py,sha256=gCgbynxG3jA8FQHzercKtrHKHkiIKr8APdZYUniAor8,55
187
+ uncountable/types/api/project/get_projects.py,sha256=8_hXCd7sWOXajL6RqN-oFZWJqiVywzEPqQxOIUu07C4,1222
188
+ uncountable/types/api/project/get_projects_data.py,sha256=gulOmoOVTOIjGAXPLZ-GNZ0oBGww59kl-ev6Bdk5jTE,1452
189
+ uncountable/types/api/recipe_links/__init__.py,sha256=gCgbynxG3jA8FQHzercKtrHKHkiIKr8APdZYUniAor8,55
190
+ uncountable/types/api/recipe_links/create_recipe_link.py,sha256=CTkiELzsdt9tn2VM9Rzs6dYHTNW853ylyYUfcyy6Ft4,1173
191
+ uncountable/types/api/recipe_links/remove_recipe_link.py,sha256=JAziNUPh_j8TlTjx8H4tqwRcEqZ_u4dcl4P0Gd_5x9g,1159
192
+ uncountable/types/api/recipe_metadata/__init__.py,sha256=gCgbynxG3jA8FQHzercKtrHKHkiIKr8APdZYUniAor8,55
193
+ uncountable/types/api/recipe_metadata/get_recipe_metadata_data.py,sha256=hmI8txYW43p7-x3EG6JkQzUlw9Jlutg1WoC_mMrGDGA,1264
194
+ uncountable/types/api/recipes/__init__.py,sha256=gCgbynxG3jA8FQHzercKtrHKHkiIKr8APdZYUniAor8,55
195
+ uncountable/types/api/recipes/add_recipe_to_project.py,sha256=c0UriWJJdGLhraed06mKJ1c3aBXQCa1BBCYG_JLhxM0,858
196
+ uncountable/types/api/recipes/archive_recipes.py,sha256=y6bqx-nBDN-PIPnGxnleFAzhsLq-BecjHgZ_BfH_0jM,843
197
+ uncountable/types/api/recipes/associate_recipe_as_input.py,sha256=DXZf7SlcyzCAegW4qdVatMRCig288xDEe6UZjvwea7k,1003
198
+ uncountable/types/api/recipes/associate_recipe_as_lot.py,sha256=4NjNp2ULxaUcGiMp5hKjnjMbmLu-jTSI2KcfGvAqi1I,931
199
+ uncountable/types/api/recipes/create_recipe.py,sha256=9-t2K2kKrmjctGXdisFpw-1MCNR0IAaeWEb6S7U_Q9Q,1362
200
+ uncountable/types/api/recipes/create_recipes.py,sha256=G--GmvY_8Nz4epYaaOExmiTxH15Cl2POjXFgbLTd2z0,1522
201
+ uncountable/types/api/recipes/disassociate_recipe_as_input.py,sha256=5l_gzIEPCLZIlgt8jr9iS4xQ0c-BAr6SsS7HmY2TAZk,889
202
+ uncountable/types/api/recipes/edit_recipe_inputs.py,sha256=kEKTP5L4kmrFkzc4FYPSj_SEH32Vw6U7VPGxdMTr3ls,5462
203
+ uncountable/types/api/recipes/get_curve.py,sha256=dx0E7qt_wWAYT9AgmcIeqZor-p3a0LRoVPk9K8qg7oE,926
204
+ uncountable/types/api/recipes/get_recipe_calculations.py,sha256=T175uU5P7RsLul_A4dE4Lcc_1LcURS8Peozf63q2pk0,1453
205
+ uncountable/types/api/recipes/get_recipe_links.py,sha256=B38zia1Gxkyf8mX0SctVZ0fk3e0QFHOgo_VL2RCZWcM,966
206
+ uncountable/types/api/recipes/get_recipe_names.py,sha256=KSeaKWTjBTNbeyNXiHscTUvioz1HNQ-MCGd2_1ScYb0,983
207
+ uncountable/types/api/recipes/get_recipe_output_metadata.py,sha256=FEq_PCPg1JqKYpNaL6ZtowgDPIQEP_8eckrRjEM5fIM,1435
208
+ uncountable/types/api/recipes/get_recipes_data.py,sha256=vezKPPviX1y8uZMosuDdZeg4PrDMwLz4jurwFtvVtVE,5337
209
+ uncountable/types/api/recipes/lock_recipes.py,sha256=pg3oj21oHmTgDrfj9ff4XPX6-9aU0HmM2jPrZcB4tas,1335
210
+ uncountable/types/api/recipes/remove_recipe_from_project.py,sha256=lYjCR4F5V949tykrQaSXQOjpDMDUF2xtBEdJu4Nt4Xw,863
211
+ uncountable/types/api/recipes/set_recipe_inputs.py,sha256=d-vO7kvHihn4mdkzXr_hc7FsRbdC45pM0kyhTWEOPss,1423
212
+ uncountable/types/api/recipes/set_recipe_metadata.py,sha256=_I2BmhuXD-69EWgnkycA5JMv78gmHSEvc4VGUDSTsmg,905
213
+ uncountable/types/api/recipes/set_recipe_output_annotations.py,sha256=zXhzujnRNswxwWFZL8lFSMNbbatTP1Lfzmv39xc1a44,2873
214
+ uncountable/types/api/recipes/set_recipe_outputs.py,sha256=Qt_zXRbDoTnR6ivSd9CAUYb3JbMk1gzy2Ecp6WNW9NM,1696
215
+ uncountable/types/api/recipes/set_recipe_tags.py,sha256=OCzWDST6My5zmwjaW_3rqV0sSozjpzhIbm1Gky6IxgM,2436
216
+ uncountable/types/api/recipes/unarchive_recipes.py,sha256=W_tOZgz_FEVQcI3y1tnxJzxHusSz1OcByQIDoHLliHg,805
217
+ uncountable/types/api/recipes/unlock_recipes.py,sha256=BORmGgYjQfBVRnqimVXc-RcvG3QJkvexesTGuKdgoOw,1094
218
+ uncountable/types/api/triggers/__init__.py,sha256=gCgbynxG3jA8FQHzercKtrHKHkiIKr8APdZYUniAor8,55
219
+ uncountable/types/api/triggers/run_trigger.py,sha256=nV81yBsxmBi5u4hJyO8RhOd6zG0BK0y1aN33zLDbJmM,884
220
+ UncountablePythonSDK-0.0.41.dist-info/METADATA,sha256=Y8go69WL8lqmsIZjvbolQvZSZKv2aHelEUa0Ghi2ZI0,1577
221
+ UncountablePythonSDK-0.0.41.dist-info/WHEEL,sha256=R0nc6qTxuoLk7ShA2_Y-UWkN8ZdfDBG2B6Eqpz2WXbs,91
222
+ UncountablePythonSDK-0.0.41.dist-info/top_level.txt,sha256=1UVGjAU-6hJY9qw2iJ7nCBeEwZ793AEN5ZfKX9A1uj4,31
223
+ UncountablePythonSDK-0.0.41.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (71.1.0)
2
+ Generator: setuptools (72.1.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5
 
@@ -8,13 +8,13 @@ from decimal import Decimal
8
8
  from importlib import resources
9
9
 
10
10
  import dateutil.parser
11
- import yaml
12
11
 
13
12
  from pkgs.serialization import (
14
13
  MissingSentryType,
15
14
  OpaqueKey,
16
15
  get_serial_class_data,
17
16
  get_serial_union_data,
17
+ yaml,
18
18
  )
19
19
 
20
20
  from ._is_enum import is_string_enum_class
@@ -0,0 +1,54 @@
1
+ from decimal import Decimal
2
+ from typing import TYPE_CHECKING, Any
3
+
4
+ import yaml
5
+
6
+ if TYPE_CHECKING:
7
+ from _typeshed import SupportsRead as SupportsReadT
8
+ from _typeshed import SupportsWrite as SupportsWriteT
9
+
10
+ SupportsRead = SupportsReadT[Any]
11
+ SupportsWrite = SupportsWriteT[Any]
12
+ else:
13
+ SupportsRead = object
14
+ SupportsWrite = object
15
+
16
+
17
+ def _decimal_constructor(loader, node): # type:ignore
18
+ value = loader.construct_scalar(node)
19
+ return Decimal(value)
20
+
21
+
22
+ # A semi-acceptable patch to force a number to be parsed as a decimal, since pyyaml
23
+ # parses them as lossy floats otherwise. Though a bit ugly, at least this way we have
24
+ # support for decimal constants
25
+ yaml.SafeLoader.add_constructor("!decimal", _decimal_constructor)
26
+
27
+
28
+ class YAMLError(BaseException):
29
+ pass
30
+
31
+
32
+ def dumps(obj: Any, sort_keys: bool = False) -> str:
33
+ return yaml.dump(obj, sort_keys=sort_keys)
34
+
35
+
36
+ def dump(obj: Any, f: SupportsWrite, sort_keys: bool = False) -> None:
37
+ yaml.dump(obj, f, sort_keys=sort_keys)
38
+
39
+
40
+ def safe_load(src: str | bytes | SupportsRead) -> Any:
41
+ try:
42
+ return yaml.safe_load(src)
43
+ except yaml.YAMLError as e:
44
+ raise YAMLError() from e
45
+
46
+
47
+ def safe_dump(
48
+ obj: Any, sort_keys: bool = False, indent: int | None = None, width: int | None = None
49
+ ) -> str:
50
+ return yaml.safe_dump(obj, sort_keys=sort_keys, indent=indent, width=width)
51
+
52
+
53
+ def c_load(f: SupportsRead) -> Any:
54
+ return yaml.load(f, Loader=yaml.CLoader)
pkgs/type_spec/config.py CHANGED
@@ -1,10 +1,9 @@
1
1
  import os
2
2
  from collections.abc import Callable, Mapping
3
3
  from dataclasses import dataclass
4
- from decimal import Decimal
5
4
  from typing import Self, TypeVar
6
5
 
7
- import yaml
6
+ from pkgs.serialization import yaml
8
7
 
9
8
  ConfigValueType = str | None | Mapping[str, str | None] | list[str]
10
9
 
@@ -103,17 +102,6 @@ def _parse_language(config_class: type[_T], raw_value: ConfigValueType) -> _T:
103
102
  return config_class(**raw_value)
104
103
 
105
104
 
106
- def _decimal_constructor(loader, node): # type:ignore
107
- value = loader.construct_scalar(node)
108
- return Decimal(value)
109
-
110
-
111
- # A semi-acceptable patch to force a number to be parsed as a decimal, since pyyaml
112
- # parses them as lossy floats otherwise. Though a bit ugly, at least this way we have
113
- # support for decimal constants
114
- yaml.SafeLoader.add_constructor("!decimal", _decimal_constructor)
115
-
116
-
117
105
  def parse_yaml_config(config_file: str) -> Config:
118
106
  with open(config_file, encoding="utf-8") as input:
119
107
  raw_config: dict[str, ConfigValueType] = yaml.safe_load(input)
@@ -9,7 +9,7 @@ import json
9
9
  import re
10
10
  from typing import Collection, cast
11
11
 
12
- import yaml
12
+ from pkgs.serialization import yaml
13
13
 
14
14
  from . import builder, util
15
15
  from .builder import EndpointGuideKey, RootGuideKey
@@ -169,7 +169,7 @@ def _serialize_global_context(ctx: EmitOpenAPIGlobalContext) -> str:
169
169
  oa_paths[path.path] = {"$ref": path.ref}
170
170
  oa_root["paths"] = oa_paths
171
171
 
172
- return yaml.dump(oa_root, sort_keys=False)
172
+ return yaml.dumps(oa_root, sort_keys=False)
173
173
 
174
174
 
175
175
  def _is_empty_object_type(typ: OpenAPIType) -> bool:
@@ -413,7 +413,7 @@ def _emit_namespace(
413
413
 
414
414
  path = f"{config.types_output}/common/{'/'.join(namespace.path)}.yaml"
415
415
  oa_namespace = {"components": oa_components}
416
- _rewrite_with_notice(path, yaml.dump(oa_namespace, sort_keys=False))
416
+ _rewrite_with_notice(path, yaml.dumps(oa_namespace, sort_keys=False))
417
417
 
418
418
 
419
419
  def _emit_type(
@@ -23,7 +23,7 @@ __all__: list[str] = [
23
23
  """
24
24
  END_ALL_EXPORTS = "]\n"
25
25
 
26
- ASYNC_BATCH_TYPE_NAMESPACE = builder.SpecNamespace(name="uncountable.types.async_batch")
26
+ ASYNC_BATCH_TYPE_NAMESPACE = builder.SpecNamespace(name="async_batch")
27
27
  ASYNC_BATCH_REQUEST_PATH_STYPE = builder.SpecTypeDefnStringEnum(
28
28
  namespace=ASYNC_BATCH_TYPE_NAMESPACE, name="AsyncBatchRequestPath"
29
29
  )
@@ -57,7 +57,9 @@ class Context(TrackingContext):
57
57
 
58
58
 
59
59
  def _resolve_namespace_name(namespace: builder.SpecNamespace) -> str:
60
- return namespace.name
60
+ if len(namespace.path) > 1:
61
+ return namespace.name
62
+ return f"{namespace.name}_t"
61
63
 
62
64
 
63
65
  def _resolve_namespace_ref(namespace: builder.SpecNamespace) -> str:
@@ -294,17 +296,22 @@ def _emit_types(*, builder: builder.SpecBuilder, config: PythonConfig) -> None:
294
296
  full.write(f"# === END section from {namespace.name}.part.py ===\n")
295
297
 
296
298
  basename = "/".join(namespace.path)
297
- filename = f"{config.types_output}/{basename}.py"
299
+ filename = f"{config.types_output}/{basename}{'' if len(namespace.path) > 1 else '_t'}.py"
298
300
  util.rewrite_file(filename, full.getvalue())
299
301
 
302
+ # Deprecated SDK support
303
+ if config.all_named_type_exports and len(namespace.path) == 1:
304
+ compat_out = _create_sdk_compat_namespace(namespace)
305
+ compat_filename = f"{config.types_output}/{basename}.py"
306
+ util.rewrite_file(compat_filename, compat_out.getvalue())
307
+
300
308
  path_to = os.path.dirname(basename)
301
309
  while path_to != "":
302
310
  all_dirs.add(path_to)
303
311
  path_to = os.path.dirname(path_to)
304
312
 
305
- if len(namespace.path) == 1 or (
306
- config.all_named_type_exports and len(namespace.path) > 1
307
- ):
313
+ # Deprecated SDK support
314
+ if config.all_named_type_exports:
308
315
  index_out.write("from ")
309
316
  if len(namespace.path) == 1:
310
317
  index_out.write(".")
@@ -354,6 +361,32 @@ def _emit_namespace(ctx: Context, namespace: builder.SpecNamespace) -> None:
354
361
  _emit_constant(ctx, sconst)
355
362
 
356
363
 
364
+ def _create_sdk_compat_namespace(namespace: builder.SpecNamespace) -> io.StringIO:
365
+ compat_out = io.StringIO()
366
+ compat_out.write(LINT_HEADER)
367
+ compat_out.write(MODIFY_NOTICE)
368
+ compat_out.write("# Kept only for SDK backwards compatibility\n")
369
+
370
+ # This mostly an prepart import, thus has no high-level knowledge. Since this onl
371
+ # needs backwards copmatibiltiy from when written we can just hardcode what was there
372
+ # (only those in __all__ assuming that worked, which it might not)
373
+ if namespace.name == "base":
374
+ compat_out.write("""
375
+ from .base_t import JsonScalar as JsonScalar
376
+ from .base_t import JsonValue as JsonValue
377
+ from .base_t import ObjectId as ObjectId
378
+ """)
379
+ else:
380
+ for stype in namespace.types.values():
381
+ compat_out.write(
382
+ f"from .{namespace.path[-1]}_t import {stype.name} as {stype.name}\n"
383
+ )
384
+
385
+ compat_out.write(MODIFY_NOTICE)
386
+
387
+ return compat_out
388
+
389
+
357
390
  def _validate_supports_handler_generation(
358
391
  stype: builder.SpecTypeDefn, name: str, supports_inheritance: bool = False
359
392
  ) -> builder.SpecTypeDefnObject:
@@ -994,7 +1027,7 @@ def _emit_namespace_imports(
994
1027
  else:
995
1028
  from_path = config.types_package
996
1029
 
997
- out.write(f"from {from_path} import {resolved} as {ref}\n")
1030
+ out.write(f"from {from_path} import {resolved}\n")
998
1031
 
999
1032
 
1000
1033
  def _emit_id_source(*, builder: builder.SpecBuilder, config: PythonConfig) -> None:
@@ -3,9 +3,10 @@ from collections.abc import Callable
3
3
  from io import StringIO
4
4
  from typing import Optional
5
5
 
6
- import yaml
7
6
  from shelljob import fs
8
7
 
8
+ from pkgs.serialization import yaml
9
+
9
10
  from .builder import SpecBuilder
10
11
  from .config import Config
11
12
 
@@ -6,7 +6,7 @@ import json
6
6
  from typing import Any, Optional, TypeAlias, Union, cast
7
7
 
8
8
  from main.base.types import data_t
9
- from main.base.types.base import PureJsonValue
9
+ from main.base.types.base_t import PureJsonValue
10
10
  from pkgs.argument_parser import CachedParser
11
11
  from pkgs.serialization_util import (
12
12
  serialize_for_api,
@@ -20,9 +20,9 @@ import sys
20
20
  from typing import TypeVar, cast
21
21
 
22
22
  import regex as re
23
- import yaml
24
23
 
25
24
  from main.base.types import base_t, value_spec_t
25
+ from pkgs.serialization import yaml
26
26
 
27
27
  from ..util import parse_type_str, rewrite_file
28
28
  from .convert_type import convert_to_value_spec_type
@@ -27,4 +27,6 @@ def cron_job_executor(**kwargs: dict) -> None:
27
27
  args_passed.definition.executor, args_passed.profile_metadata
28
28
  )
29
29
 
30
+ print(f"running job {args_passed.definition.name}")
31
+
30
32
  job.run(args=args)
@@ -9,10 +9,9 @@ from uncountable.integration.types import ProfileDefinition
9
9
  profile_parser = CachedParser(ProfileDefinition)
10
10
 
11
11
 
12
- def main() -> None:
12
+ def main(blocking: bool) -> None:
13
13
  profiles_module = os.environ["UNC_PROFILES_MODULE"]
14
14
  with IntegrationServer(create_db_engine()) as server:
15
- # TODO: Loop through all job spec yaml files and call server.add_job
16
15
  profiles = [
17
16
  entry
18
17
  for entry in resources.files(profiles_module).iterdir()
@@ -26,7 +25,7 @@ def main() -> None:
26
25
  resource="profile.yaml",
27
26
  )
28
27
  except FileNotFoundError as e:
29
- print("WARN: profile.yaml not found", e)
28
+ print(f"WARN: profile.yaml not found for {profile_name}", e)
30
29
  continue
31
30
  server.register_profile(
32
31
  profile_name=profile_name,
@@ -35,8 +34,8 @@ def main() -> None:
35
34
  jobs=profile.jobs,
36
35
  )
37
36
 
38
- server.serve_forever()
37
+ if blocking:
38
+ server.serve_forever()
39
39
 
40
40
 
41
- if __name__ == "__main__":
42
- main()
41
+ main(__name__ == "__main__")
@@ -37,6 +37,6 @@ class CronJob(Job):
37
37
  def run(self, args: CronJobArguments) -> JobResult: ...
38
38
 
39
39
 
40
- def register_job(cls: Job) -> Job:
40
+ def register_job(cls: type[Job]) -> type[Job]:
41
41
  cls._unc_job_registered = True
42
42
  return cls