UncountablePythonSDK 0.0.91__tar.gz → 0.0.93__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of UncountablePythonSDK might be problematic. Click here for more details.

Files changed (309) hide show
  1. {uncountablepythonsdk-0.0.91/UncountablePythonSDK.egg-info → uncountablepythonsdk-0.0.93}/PKG-INFO +2 -2
  2. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93/UncountablePythonSDK.egg-info}/PKG-INFO +2 -2
  3. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/examples/set_recipe_metadata_file.py +1 -1
  4. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/examples/upload_files.py +1 -2
  5. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/pkgs/argument_parser/__init__.py +3 -0
  6. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/pkgs/argument_parser/argument_parser.py +52 -23
  7. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/pkgs/filesystem_utils/__init__.py +1 -0
  8. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/pkgs/filesystem_utils/_gdrive_session.py +4 -4
  9. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/pkgs/filesystem_utils/_s3_session.py +2 -1
  10. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/pkgs/filesystem_utils/_sftp_session.py +2 -3
  11. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/pkgs/filesystem_utils/file_type_utils.py +10 -10
  12. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/pkgs/serialization/annotation.py +5 -5
  13. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/pkgs/serialization/missing_sentry.py +1 -1
  14. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/pkgs/serialization/serial_alias.py +3 -3
  15. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/pkgs/serialization/serial_class.py +10 -10
  16. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/pkgs/serialization/serial_generic.py +1 -1
  17. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/pkgs/serialization/serial_union.py +10 -10
  18. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/pkgs/serialization_util/__init__.py +2 -0
  19. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/pkgs/serialization_util/serialization_helpers.py +1 -4
  20. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/pkgs/type_spec/actions_registry/__main__.py +0 -4
  21. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/pkgs/type_spec/builder.py +121 -40
  22. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/pkgs/type_spec/config.py +10 -5
  23. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/pkgs/type_spec/emit_open_api.py +2 -2
  24. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/pkgs/type_spec/emit_open_api_util.py +1 -1
  25. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/pkgs/type_spec/emit_python.py +145 -63
  26. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/pkgs/type_spec/emit_typescript.py +57 -10
  27. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/pkgs/type_spec/load_types.py +1 -2
  28. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/pkgs/type_spec/open_api_util.py +1 -2
  29. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/pkgs/type_spec/parts/base.py.prepart +2 -0
  30. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/pkgs/type_spec/type_info/emit_type_info.py +8 -8
  31. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/pkgs/type_spec/util.py +5 -7
  32. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/pkgs/type_spec/value_spec/__main__.py +15 -5
  33. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/pkgs/type_spec/value_spec/emit_python.py +5 -2
  34. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/pkgs/type_spec/value_spec/types.py +1 -1
  35. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/core/client.py +16 -15
  36. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/core/file_upload.py +39 -15
  37. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/integration/construct_client.py +3 -3
  38. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/integration/executors/generic_upload_executor.py +1 -1
  39. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/integration/job.py +2 -2
  40. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/integration/queue_runner/command_server/types.py +1 -1
  41. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/integration/queue_runner/worker.py +1 -1
  42. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/integration/server.py +4 -4
  43. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/integration/telemetry.py +11 -0
  44. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/types/__init__.py +0 -1
  45. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/types/api/batch/execute_batch.py +1 -2
  46. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/types/api/batch/execute_batch_load_async.py +0 -1
  47. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/types/api/chemical/convert_chemical_formats.py +0 -1
  48. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/types/api/entity/create_entities.py +3 -4
  49. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/types/api/entity/create_entity.py +4 -5
  50. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/types/api/entity/get_entities_data.py +0 -1
  51. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/types/api/entity/grant_entity_permissions.py +3 -4
  52. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/types/api/entity/list_entities.py +5 -6
  53. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/types/api/entity/lock_entity.py +1 -2
  54. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/types/api/entity/resolve_entity_ids.py +2 -3
  55. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/types/api/entity/set_entity_field_values.py +0 -1
  56. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/types/api/entity/set_values.py +0 -1
  57. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/types/api/entity/transition_entity_phase.py +1 -2
  58. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/types/api/entity/unlock_entity.py +0 -1
  59. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/types/api/equipment/associate_equipment_input.py +0 -1
  60. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/types/api/field_options/upsert_field_options.py +3 -4
  61. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/types/api/files/download_file.py +1 -2
  62. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/types/api/id_source/list_id_source.py +3 -4
  63. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/types/api/id_source/match_id_source.py +1 -2
  64. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/types/api/input_groups/get_input_group_names.py +0 -1
  65. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/types/api/inputs/create_inputs.py +4 -5
  66. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/types/api/inputs/get_input_data.py +5 -6
  67. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/types/api/inputs/get_input_names.py +3 -4
  68. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/types/api/inputs/get_inputs_data.py +0 -1
  69. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/types/api/inputs/set_input_attribute_values.py +2 -3
  70. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/types/api/inputs/set_input_category.py +2 -3
  71. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/types/api/inputs/set_input_subcategories.py +0 -1
  72. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/types/api/inputs/set_intermediate_type.py +1 -2
  73. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/types/api/material_families/update_entity_material_families.py +1 -2
  74. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/types/api/outputs/get_output_data.py +6 -7
  75. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/types/api/outputs/get_output_names.py +2 -3
  76. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/types/api/outputs/resolve_output_conditions.py +2 -3
  77. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/types/api/permissions/set_core_permissions.py +3 -4
  78. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/types/api/project/get_projects.py +3 -4
  79. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/types/api/project/get_projects_data.py +4 -5
  80. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/types/api/recipe_links/create_recipe_link.py +1 -2
  81. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/types/api/recipe_links/remove_recipe_link.py +1 -2
  82. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/types/api/recipe_metadata/get_recipe_metadata_data.py +3 -4
  83. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/types/api/recipes/add_recipe_to_project.py +0 -1
  84. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/types/api/recipes/archive_recipes.py +1 -2
  85. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/types/api/recipes/associate_recipe_as_input.py +2 -3
  86. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/types/api/recipes/associate_recipe_as_lot.py +0 -1
  87. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/types/api/recipes/clear_recipe_outputs.py +0 -1
  88. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/types/api/recipes/create_recipe.py +6 -7
  89. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/types/api/recipes/create_recipes.py +4 -5
  90. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/types/api/recipes/disassociate_recipe_as_input.py +0 -1
  91. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/types/api/recipes/edit_recipe_inputs.py +9 -10
  92. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/types/api/recipes/get_column_calculation_values.py +1 -2
  93. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/types/api/recipes/get_curve.py +2 -3
  94. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/types/api/recipes/get_recipe_calculations.py +3 -4
  95. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/types/api/recipes/get_recipe_links.py +1 -2
  96. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/types/api/recipes/get_recipe_names.py +0 -1
  97. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/types/api/recipes/get_recipe_output_metadata.py +0 -1
  98. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/types/api/recipes/get_recipes_data.py +22 -23
  99. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/types/api/recipes/lock_recipes.py +3 -4
  100. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/types/api/recipes/remove_recipe_from_project.py +0 -1
  101. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/types/api/recipes/set_recipe_inputs.py +6 -7
  102. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/types/api/recipes/set_recipe_metadata.py +0 -1
  103. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/types/api/recipes/set_recipe_output_annotations.py +5 -6
  104. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/types/api/recipes/set_recipe_output_file.py +2 -3
  105. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/types/api/recipes/set_recipe_outputs.py +8 -9
  106. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/types/api/recipes/set_recipe_tags.py +2 -3
  107. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/types/api/recipes/unarchive_recipes.py +0 -1
  108. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/types/api/recipes/unlock_recipes.py +2 -3
  109. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/types/api/triggers/run_trigger.py +1 -2
  110. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/types/api/uploader/invoke_uploader.py +2 -3
  111. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/types/async_batch.py +0 -1
  112. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/types/async_batch_processor.py +23 -24
  113. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/types/async_batch_t.py +5 -6
  114. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/types/async_jobs.py +0 -1
  115. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/types/async_jobs_t.py +1 -2
  116. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/types/auth_retrieval.py +0 -1
  117. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/types/auth_retrieval_t.py +2 -3
  118. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/types/base.py +0 -1
  119. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/types/base_t.py +2 -1
  120. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/types/calculations.py +0 -1
  121. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/types/calculations_t.py +0 -1
  122. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/types/chemical_structure.py +0 -1
  123. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/types/chemical_structure_t.py +3 -4
  124. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/types/client_base.py +65 -66
  125. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/types/client_config.py +0 -1
  126. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/types/client_config_t.py +1 -2
  127. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/types/curves.py +0 -1
  128. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/types/curves_t.py +4 -5
  129. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/types/entity.py +0 -1
  130. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/types/entity_t.py +3 -4
  131. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/types/experiment_groups.py +0 -1
  132. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/types/experiment_groups_t.py +0 -1
  133. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/types/field_values.py +0 -1
  134. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/types/field_values_t.py +6 -7
  135. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/types/fields.py +0 -1
  136. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/types/fields_t.py +0 -1
  137. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/types/generic_upload.py +0 -1
  138. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/types/generic_upload_t.py +7 -8
  139. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/types/id_source.py +0 -1
  140. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/types/id_source_t.py +2 -3
  141. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/types/identifier.py +0 -1
  142. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/types/identifier_t.py +1 -2
  143. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/types/input_attributes.py +0 -1
  144. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/types/input_attributes_t.py +2 -3
  145. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/types/inputs.py +0 -1
  146. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/types/inputs_t.py +2 -3
  147. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/types/integration_server.py +0 -1
  148. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/types/integration_server_t.py +2 -3
  149. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/types/job_definition.py +0 -1
  150. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/types/job_definition_t.py +16 -17
  151. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/types/outputs.py +0 -1
  152. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/types/outputs_t.py +1 -2
  153. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/types/overrides.py +0 -1
  154. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/types/overrides_t.py +0 -1
  155. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/types/permissions.py +0 -1
  156. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/types/permissions_t.py +1 -2
  157. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/types/phases.py +0 -1
  158. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/types/phases_t.py +0 -1
  159. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/types/post_base.py +0 -1
  160. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/types/post_base_t.py +1 -2
  161. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/types/queued_job.py +0 -1
  162. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/types/queued_job_t.py +2 -3
  163. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/types/recipe_identifiers.py +0 -1
  164. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/types/recipe_identifiers_t.py +3 -4
  165. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/types/recipe_inputs.py +0 -1
  166. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/types/recipe_inputs_t.py +1 -2
  167. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/types/recipe_links.py +0 -1
  168. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/types/recipe_links_t.py +2 -3
  169. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/types/recipe_metadata.py +0 -1
  170. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/types/recipe_metadata_t.py +6 -7
  171. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/types/recipe_output_metadata.py +0 -1
  172. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/types/recipe_output_metadata_t.py +0 -1
  173. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/types/recipe_tags.py +0 -1
  174. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/types/recipe_tags_t.py +0 -1
  175. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/types/recipe_workflow_steps.py +0 -1
  176. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/types/recipe_workflow_steps_t.py +2 -3
  177. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/types/recipes.py +0 -1
  178. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/types/recipes_t.py +0 -1
  179. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/types/response.py +0 -1
  180. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/types/response_t.py +0 -1
  181. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/types/secret_retrieval.py +0 -1
  182. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/types/secret_retrieval_t.py +3 -4
  183. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/types/units.py +0 -1
  184. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/types/units_t.py +0 -1
  185. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/types/users.py +0 -1
  186. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/types/users_t.py +0 -1
  187. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/types/webhook_job.py +0 -1
  188. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/types/webhook_job_t.py +0 -1
  189. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/types/workflows.py +0 -1
  190. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/types/workflows_t.py +1 -2
  191. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/.github/workflows/documentation.yml +0 -0
  192. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/.github/workflows/publish.yml +0 -0
  193. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/.gitignore +0 -0
  194. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/README.md +0 -0
  195. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/UncountablePythonSDK.egg-info/SOURCES.txt +0 -0
  196. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/UncountablePythonSDK.egg-info/dependency_links.txt +0 -0
  197. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/UncountablePythonSDK.egg-info/requires.txt +0 -0
  198. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/UncountablePythonSDK.egg-info/top_level.txt +0 -0
  199. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/docs/.gitignore +0 -0
  200. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/docs/conf.py +0 -0
  201. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/docs/index.md +0 -0
  202. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/docs/justfile +0 -0
  203. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/docs/quickstart.md +0 -0
  204. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/docs/requirements.txt +0 -0
  205. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/docs/static/favicons/android-chrome-192x192.png +0 -0
  206. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/docs/static/favicons/android-chrome-512x512.png +0 -0
  207. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/docs/static/favicons/apple-touch-icon.png +0 -0
  208. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/docs/static/favicons/browserconfig.xml +0 -0
  209. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/docs/static/favicons/favicon-16x16.png +0 -0
  210. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/docs/static/favicons/favicon-32x32.png +0 -0
  211. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/docs/static/favicons/manifest.json +0 -0
  212. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/docs/static/favicons/mstile-150x150.png +0 -0
  213. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/docs/static/favicons/safari-pinned-tab.svg +0 -0
  214. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/docs/static/logo_blue.png +0 -0
  215. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/examples/async_batch.py +0 -0
  216. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/examples/create_entity.py +0 -0
  217. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/examples/download_files.py +0 -0
  218. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/examples/edit_recipe_inputs.py +0 -0
  219. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/examples/integration-server/jobs/materials_auto/example_cron.py +0 -0
  220. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/examples/integration-server/jobs/materials_auto/example_wh.py +0 -0
  221. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/examples/integration-server/jobs/materials_auto/profile.yaml +0 -0
  222. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/examples/integration-server/pyproject.toml +0 -0
  223. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/examples/invoke_uploader.py +0 -0
  224. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/examples/set_recipe_output_file_sdk.py +0 -0
  225. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/pkgs/__init__.py +0 -0
  226. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/pkgs/argument_parser/_is_enum.py +0 -0
  227. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/pkgs/argument_parser/_is_namedtuple.py +0 -0
  228. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/pkgs/argument_parser/case_convert.py +0 -0
  229. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/pkgs/filesystem_utils/_blob_session.py +0 -0
  230. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/pkgs/filesystem_utils/_local_session.py +0 -0
  231. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/pkgs/filesystem_utils/filesystem_session.py +0 -0
  232. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/pkgs/py.typed +0 -0
  233. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/pkgs/serialization/__init__.py +0 -0
  234. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/pkgs/serialization/opaque_key.py +0 -0
  235. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/pkgs/serialization/yaml.py +0 -0
  236. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/pkgs/serialization_util/_get_type_for_serialization.py +0 -0
  237. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/pkgs/serialization_util/convert_to_snakecase.py +0 -0
  238. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/pkgs/serialization_util/dataclasses.py +0 -0
  239. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/pkgs/strenum_compat/__init__.py +0 -0
  240. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/pkgs/strenum_compat/strenum_compat.py +0 -0
  241. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/pkgs/type_spec/__init__.py +0 -0
  242. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/pkgs/type_spec/__main__.py +0 -0
  243. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/pkgs/type_spec/actions_registry/__init__.py +0 -0
  244. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/pkgs/type_spec/actions_registry/emit_typescript.py +0 -0
  245. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/pkgs/type_spec/emit_io_ts.py +0 -0
  246. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/pkgs/type_spec/emit_typescript_util.py +0 -0
  247. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/pkgs/type_spec/parts/base.ts.prepart +0 -0
  248. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/pkgs/type_spec/test.py +0 -0
  249. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/pkgs/type_spec/type_info/__main__.py +0 -0
  250. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/pkgs/type_spec/value_spec/__init__.py +0 -0
  251. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/pkgs/type_spec/value_spec/convert_type.py +0 -0
  252. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/pyproject.toml +0 -0
  253. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/setup.cfg +0 -0
  254. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/__init__.py +0 -0
  255. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/core/__init__.py +0 -0
  256. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/core/async_batch.py +0 -0
  257. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/core/environment.py +0 -0
  258. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/core/types.py +0 -0
  259. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/integration/__init__.py +0 -0
  260. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/integration/cli.py +0 -0
  261. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/integration/cron.py +0 -0
  262. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/integration/db/__init__.py +0 -0
  263. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/integration/db/connect.py +0 -0
  264. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/integration/db/session.py +0 -0
  265. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/integration/entrypoint.py +0 -0
  266. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/integration/executors/__init__.py +0 -0
  267. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/integration/executors/executors.py +0 -0
  268. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/integration/executors/script_executor.py +0 -0
  269. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/integration/queue_runner/__init__.py +0 -0
  270. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/integration/queue_runner/command_server/__init__.py +0 -0
  271. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/integration/queue_runner/command_server/command_client.py +0 -0
  272. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/integration/queue_runner/command_server/command_server.py +0 -0
  273. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/integration/queue_runner/command_server/protocol/__init__.py +0 -0
  274. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/integration/queue_runner/command_server/protocol/command_server.proto +0 -0
  275. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/integration/queue_runner/command_server/protocol/command_server_pb2.py +0 -0
  276. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/integration/queue_runner/command_server/protocol/command_server_pb2.pyi +0 -0
  277. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/integration/queue_runner/command_server/protocol/command_server_pb2_grpc.py +0 -0
  278. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/integration/queue_runner/datastore/__init__.py +0 -0
  279. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/integration/queue_runner/datastore/datastore_sqlite.py +0 -0
  280. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/integration/queue_runner/datastore/interface.py +0 -0
  281. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/integration/queue_runner/datastore/model.py +0 -0
  282. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/integration/queue_runner/job_scheduler.py +0 -0
  283. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/integration/queue_runner/queue_runner.py +0 -0
  284. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/integration/queue_runner/types.py +0 -0
  285. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/integration/scan_profiles.py +0 -0
  286. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/integration/scheduler.py +0 -0
  287. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/integration/secret_retrieval/__init__.py +0 -0
  288. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/integration/secret_retrieval/retrieve_secret.py +0 -0
  289. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/integration/webhook_server/entrypoint.py +0 -0
  290. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/py.typed +0 -0
  291. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/types/api/__init__.py +0 -0
  292. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/types/api/batch/__init__.py +0 -0
  293. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/types/api/chemical/__init__.py +0 -0
  294. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/types/api/entity/__init__.py +0 -0
  295. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/types/api/equipment/__init__.py +0 -0
  296. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/types/api/field_options/__init__.py +0 -0
  297. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/types/api/files/__init__.py +0 -0
  298. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/types/api/id_source/__init__.py +0 -0
  299. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/types/api/input_groups/__init__.py +0 -0
  300. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/types/api/inputs/__init__.py +0 -0
  301. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/types/api/material_families/__init__.py +0 -0
  302. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/types/api/outputs/__init__.py +0 -0
  303. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/types/api/permissions/__init__.py +0 -0
  304. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/types/api/project/__init__.py +0 -0
  305. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/types/api/recipe_links/__init__.py +0 -0
  306. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/types/api/recipe_metadata/__init__.py +0 -0
  307. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/types/api/recipes/__init__.py +0 -0
  308. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/types/api/triggers/__init__.py +0 -0
  309. {uncountablepythonsdk-0.0.91 → uncountablepythonsdk-0.0.93}/uncountable/types/api/uploader/__init__.py +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
@@ -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
@@ -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
 
@@ -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] = []
@@ -1,7 +1,7 @@
1
1
  import os
2
2
  from dataclasses import dataclass
3
3
  from io import BytesIO
4
- from typing import Optional, Union
4
+ from typing import Union
5
5
 
6
6
  import paramiko
7
7
  from azure.core.credentials import (
@@ -17,9 +17,9 @@ class FileObjectData:
17
17
  file_data: bytes
18
18
  file_IO: BytesIO
19
19
  filename: str
20
- filepath: Optional[str] = None
21
- mime_type: Optional[str] = None
22
- metadata: Optional[dict[str, str]] = None
20
+ filepath: str | None = None
21
+ mime_type: str | None = None
22
+ metadata: dict[str, str] | None = None
23
23
 
24
24
 
25
25
  @dataclass
@@ -39,7 +39,7 @@ class FileSystemFileReference:
39
39
  class RemoteObjectReference:
40
40
  file_id: str
41
41
  mime_type: str
42
- filename: Optional[str] = None
42
+ filename: str | None = None
43
43
 
44
44
  @property
45
45
  def is_dir(self) -> bool:
@@ -63,7 +63,7 @@ class FileSystemSFTPConfig:
63
63
  pem_path: str | None
64
64
  pem_key: paramiko.RSAKey | None = None
65
65
  password: str | None = None
66
- valid_extensions: Optional[tuple[str]] = None
66
+ valid_extensions: tuple[str] | None = None
67
67
  recursive: bool = True
68
68
 
69
69
 
@@ -71,10 +71,10 @@ class FileSystemSFTPConfig:
71
71
  class FileSystemS3Config:
72
72
  endpoint_url: str
73
73
  bucket_name: str
74
- region_name: Optional[str]
75
- access_key_id: Optional[str]
76
- secret_access_key: Optional[str]
77
- session_token: Optional[str]
74
+ region_name: str | None
75
+ access_key_id: str | None
76
+ secret_access_key: str | None
77
+ session_token: str | None
78
78
 
79
79
 
80
80
  @dataclass(kw_only=True)
@@ -6,7 +6,7 @@ T = typing.TypeVar("T")
6
6
 
7
7
  @dataclasses.dataclass(kw_only=True, frozen=True, eq=True)
8
8
  class SerialBase:
9
- named_type_path: typing.Optional[str] = None
9
+ named_type_path: str | None = None
10
10
  # Indicates this type is allowed in dynamic lookups, such as via a named_type_path
11
11
  # This isn't meant to be limting, but to catalog all the types where we need it
12
12
  is_dynamic_allowed: bool = False
@@ -16,7 +16,7 @@ class SerialBase:
16
16
  from_decorator: bool = False
17
17
 
18
18
 
19
- def get_serial_annotation(parsed_type: type[T]) -> SerialBase | None:
19
+ def get_serial_annotation[T](parsed_type: type[T]) -> SerialBase | None:
20
20
  if not hasattr(parsed_type, "__metadata__"):
21
21
  return None
22
22
  metadata = parsed_type.__metadata__ # type:ignore[attr-defined]
@@ -28,13 +28,13 @@ def get_serial_annotation(parsed_type: type[T]) -> SerialBase | None:
28
28
  return serial
29
29
 
30
30
 
31
- class SerialInspector(typing.Generic[T]):
31
+ class SerialInspector[T]:
32
32
  def __init__(self, parsed_type: type[T], serial_base: SerialBase) -> None:
33
33
  self._parsed_type = parsed_type
34
34
  self._serial_base = serial_base
35
35
 
36
36
  @property
37
- def named_type_path(self) -> typing.Optional[str]:
37
+ def named_type_path(self) -> str | None:
38
38
  return self._serial_base.named_type_path
39
39
 
40
40
  @property
@@ -53,7 +53,7 @@ class SerialInspector(typing.Generic[T]):
53
53
  return self._serial_base.is_dynamic_allowed
54
54
 
55
55
 
56
- def unwrap_annotated(parsed_type: type[T]) -> type[T]:
56
+ def unwrap_annotated[T](parsed_type: type[T]) -> type[T]:
57
57
  """
58
58
  If the type is an annotated type then return the origin of it.
59
59
  Otherwise return the original type.
@@ -26,5 +26,5 @@ MISSING_SENTRY = MissingSentryType()
26
26
  MissingType = Union[MissingSentryType, ClassT]
27
27
 
28
28
 
29
- def coalesce_missing_sentry(value: MissingType[ClassT]) -> Optional[ClassT]:
29
+ def coalesce_missing_sentry[ClassT](value: MissingType[ClassT]) -> ClassT | None:
30
30
  return None if isinstance(value, MissingSentryType) else value
@@ -16,7 +16,7 @@ class _SerialAlias(SerialBase):
16
16
 
17
17
  def serial_alias_annotation(
18
18
  *,
19
- named_type_path: typing.Optional[str] = None,
19
+ named_type_path: str | None = None,
20
20
  is_dynamic_allowed: bool = False,
21
21
  ) -> _SerialAlias:
22
22
  return _SerialAlias(
@@ -26,7 +26,7 @@ def serial_alias_annotation(
26
26
  )
27
27
 
28
28
 
29
- def _get_serial_alias(parsed_type: type[T]) -> _SerialAlias | None:
29
+ def _get_serial_alias[T](parsed_type: type[T]) -> _SerialAlias | None:
30
30
  serial = get_serial_annotation(parsed_type)
31
31
  if not isinstance(serial, _SerialAlias):
32
32
  return None
@@ -39,7 +39,7 @@ class SerialAliasInspector(SerialInspector[T]):
39
39
  self._serial_alias = serial_alias
40
40
 
41
41
 
42
- def get_serial_alias_data(parsed_type: type[T]) -> SerialAliasInspector[T] | None:
42
+ def get_serial_alias_data[T](parsed_type: type[T]) -> SerialAliasInspector[T] | None:
43
43
  serial = _get_serial_alias(parsed_type)
44
44
  if serial is None:
45
45
  return None
@@ -3,7 +3,7 @@ from __future__ import annotations
3
3
  import dataclasses
4
4
  from collections.abc import Callable
5
5
  from enum import StrEnum
6
- from typing import Any, Optional, TypeVar, cast
6
+ from typing import Any, TypeVar, cast
7
7
 
8
8
  from .annotation import SerialBase, SerialInspector
9
9
 
@@ -16,7 +16,7 @@ class _SerialClassData(SerialBase):
16
16
  unconverted_values: set[str] = dataclasses.field(default_factory=set)
17
17
  to_string_values: set[str] = dataclasses.field(default_factory=set)
18
18
  parse_require: set[str] = dataclasses.field(default_factory=set)
19
- named_type_path: Optional[str] = None
19
+ named_type_path: str | None = None
20
20
 
21
21
 
22
22
  EMPTY_SERIAL_CLASS_DATA = _SerialClassData()
@@ -24,11 +24,11 @@ EMPTY_SERIAL_CLASS_DATA = _SerialClassData()
24
24
 
25
25
  def serial_class(
26
26
  *,
27
- unconverted_keys: Optional[set[str]] = None,
28
- unconverted_values: Optional[set[str]] = None,
29
- to_string_values: Optional[set[str]] = None,
30
- parse_require: Optional[set[str]] = None,
31
- named_type_path: Optional[str] = None,
27
+ unconverted_keys: set[str] | None = None,
28
+ unconverted_values: set[str] | None = None,
29
+ to_string_values: set[str] | None = None,
30
+ parse_require: set[str] | None = None,
31
+ named_type_path: str | None = None,
32
32
  is_dynamic_allowed: bool = False,
33
33
  ) -> Callable[[_ClassT], _ClassT]:
34
34
  """
@@ -119,7 +119,7 @@ def get_merged_serial_class_data(type_class: type[Any]) -> _SerialClassData | No
119
119
  return base_class_data
120
120
 
121
121
 
122
- def get_serial_class_data(
122
+ def get_serial_class_data[_ClassT](
123
123
  type_class: type[_ClassT],
124
124
  ) -> SerialClassDataInspector[_ClassT]:
125
125
  return SerialClassDataInspector(
@@ -134,7 +134,7 @@ class _SerialStringEnumData:
134
134
 
135
135
 
136
136
  def serial_string_enum(
137
- *, labels: Optional[dict[str, str]] = None, deprecated: Optional[set[str]] = None
137
+ *, labels: dict[str, str] | None = None, deprecated: set[str] | None = None
138
138
  ) -> Callable[[_ClassT], _ClassT]:
139
139
  """
140
140
  A decorator for enums to provide serialization data, including labels.
@@ -153,7 +153,7 @@ class SerialStringEnumInspector:
153
153
  def __init__(self, current: _SerialStringEnumData) -> None:
154
154
  self.current = current
155
155
 
156
- def get_label(self, value: str) -> Optional[str]:
156
+ def get_label(self, value: str) -> str | None:
157
157
  return self.current.labels.get(value)
158
158
 
159
159
  def get_deprecated(self, value: str) -> bool:
@@ -6,7 +6,7 @@ from .serial_class import get_merged_serial_class_data
6
6
  T = typing.TypeVar("T")
7
7
 
8
8
 
9
- def get_serial_data(parsed_type: type[T]) -> SerialInspector[T] | None:
9
+ def get_serial_data[T](parsed_type: type[T]) -> SerialInspector[T] | None:
10
10
  serial = get_serial_annotation(parsed_type)
11
11
  if serial is None:
12
12
  serial = get_merged_serial_class_data(parsed_type)
@@ -6,7 +6,7 @@ from .annotation import SerialBase, SerialInspector, get_serial_annotation
6
6
  T = typing.TypeVar("T")
7
7
 
8
8
 
9
- class IdentityHashWrapper(typing.Generic[T]):
9
+ class IdentityHashWrapper[T]:
10
10
  """This allows unhashable types to be used in the SerialUnion, like dict.
11
11
  Since we have only one copy of the types themselves, we rely on
12
12
  object identity for the hashing."""
@@ -27,15 +27,15 @@ class _SerialUnion(SerialBase):
27
27
 
28
28
  # If specified, indicates the Union has a discriminator which should be used to
29
29
  # determine which type to parse.
30
- discriminator: typing.Optional[str] = None
31
- discriminator_map: typing.Optional[IdentityHashWrapper[dict[str, type]]] = None
30
+ discriminator: str | None = None
31
+ discriminator_map: IdentityHashWrapper[dict[str, type]] | None = None
32
32
 
33
33
 
34
34
  def serial_union_annotation(
35
35
  *,
36
- discriminator: typing.Optional[str] = None,
37
- discriminator_map: typing.Optional[dict[str, type]] = None,
38
- named_type_path: typing.Optional[str] = None,
36
+ discriminator: str | None = None,
37
+ discriminator_map: dict[str, type] | None = None,
38
+ named_type_path: str | None = None,
39
39
  is_dynamic_allowed: bool = False,
40
40
  ) -> _SerialUnion:
41
41
  return _SerialUnion(
@@ -49,7 +49,7 @@ def serial_union_annotation(
49
49
  )
50
50
 
51
51
 
52
- def _get_serial_union(parsed_type: type[T]) -> _SerialUnion | None:
52
+ def _get_serial_union[T](parsed_type: type[T]) -> _SerialUnion | None:
53
53
  serial = get_serial_annotation(parsed_type)
54
54
  if not isinstance(serial, _SerialUnion):
55
55
  return None
@@ -66,17 +66,17 @@ class SerialClassInspector(SerialInspector[T]):
66
66
  return typing.get_args(self._parsed_type)[0] # type:ignore[no-any-return]
67
67
 
68
68
  @property
69
- def discriminator(self) -> typing.Optional[str]:
69
+ def discriminator(self) -> str | None:
70
70
  return self._serial_union.discriminator
71
71
 
72
72
  @property
73
- def discriminator_map(self) -> typing.Optional[dict[str, type]]:
73
+ def discriminator_map(self) -> dict[str, type] | None:
74
74
  if self._serial_union.discriminator_map is None:
75
75
  return None
76
76
  return self._serial_union.discriminator_map.inner
77
77
 
78
78
 
79
- def get_serial_union_data(parsed_type: type[T]) -> SerialClassInspector[T] | None:
79
+ def get_serial_union_data[T](parsed_type: type[T]) -> SerialClassInspector[T] | None:
80
80
  serial = _get_serial_union(parsed_type)
81
81
  if serial is None:
82
82
  return None
@@ -2,6 +2,7 @@ from .convert_to_snakecase import convert_dict_to_snake_case
2
2
  from .dataclasses import dict_fields as dict_fields
3
3
  from .dataclasses import iterate_fields as iterate_fields
4
4
  from .serialization_helpers import (
5
+ JsonValue,
5
6
  serialize_for_api,
6
7
  serialize_for_storage,
7
8
  serialize_for_storage_dict,
@@ -14,4 +15,5 @@ __all__: list[str] = [
14
15
  "serialize_for_storage_dict",
15
16
  "iterate_fields",
16
17
  "dict_fields",
18
+ "JsonValue",
17
19
  ]
@@ -12,7 +12,6 @@ from typing import (
12
12
  Any,
13
13
  ClassVar,
14
14
  Protocol,
15
- TypeVar,
16
15
  Union,
17
16
  overload,
18
17
  )
@@ -34,14 +33,12 @@ if TYPE_CHECKING:
34
33
  else:
35
34
  JsonValue = Union[JsonScalar, dict[str, Any], list[Any]]
36
35
 
37
- T = TypeVar("T")
38
-
39
36
 
40
37
  class Dataclass(Protocol):
41
38
  __dataclass_fields__: ClassVar[dict] # type: ignore[type-arg,unused-ignore]
42
39
 
43
40
 
44
- def identity(x: T) -> T:
41
+ def identity[T](x: T) -> T:
45
42
  return x
46
43
 
47
44
 
@@ -6,7 +6,6 @@ import os
6
6
  import sys
7
7
  from collections import defaultdict
8
8
  from dataclasses import dataclass
9
- from typing import TypeVar
10
9
 
11
10
  from main.base.types import actions_registry_t
12
11
  from pkgs.type_spec import builder
@@ -22,9 +21,6 @@ key_short_description = "short_description"
22
21
  key_description = "description"
23
22
 
24
23
 
25
- TypeT = TypeVar("TypeT")
26
-
27
-
28
24
  class InvalidSpecException(Exception):
29
25
  pass
30
26