UncountablePythonSDK 0.0.92__tar.gz → 0.0.95__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 (310) hide show
  1. {uncountablepythonsdk-0.0.92/UncountablePythonSDK.egg-info → uncountablepythonsdk-0.0.95}/PKG-INFO +2 -1
  2. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95/UncountablePythonSDK.egg-info}/PKG-INFO +2 -1
  3. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/UncountablePythonSDK.egg-info/SOURCES.txt +1 -0
  4. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/UncountablePythonSDK.egg-info/requires.txt +1 -0
  5. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/pkgs/argument_parser/argument_parser.py +7 -7
  6. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/pkgs/filesystem_utils/_s3_session.py +2 -1
  7. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/pkgs/serialization/annotation.py +3 -3
  8. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/pkgs/serialization/missing_sentry.py +1 -1
  9. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/pkgs/serialization/serial_alias.py +2 -2
  10. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/pkgs/serialization/serial_class.py +1 -1
  11. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/pkgs/serialization/serial_generic.py +1 -1
  12. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/pkgs/serialization/serial_union.py +3 -3
  13. uncountablepythonsdk-0.0.95/pkgs/serialization_util/_env_flags.py +3 -0
  14. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/pkgs/serialization_util/serialization_helpers.py +5 -5
  15. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/pkgs/type_spec/actions_registry/__main__.py +0 -4
  16. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/pkgs/type_spec/builder.py +25 -21
  17. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/pkgs/type_spec/config.py +2 -5
  18. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/pkgs/type_spec/emit_open_api.py +1 -1
  19. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/pkgs/type_spec/emit_python.py +44 -28
  20. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/pkgs/type_spec/emit_typescript.py +13 -6
  21. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/pkgs/type_spec/parts/base.py.prepart +2 -0
  22. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/pkgs/type_spec/util.py +3 -5
  23. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/pkgs/type_spec/value_spec/__main__.py +15 -5
  24. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/pkgs/type_spec/value_spec/emit_python.py +5 -2
  25. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/pkgs/type_spec/value_spec/types.py +1 -1
  26. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/pyproject.toml +2 -1
  27. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/core/client.py +14 -6
  28. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/core/file_upload.py +5 -0
  29. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/integration/job.py +2 -2
  30. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/integration/queue_runner/command_server/types.py +1 -1
  31. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/integration/server.py +4 -4
  32. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/types/__init__.py +0 -1
  33. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/types/api/batch/execute_batch.py +1 -2
  34. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/types/api/batch/execute_batch_load_async.py +0 -1
  35. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/types/api/chemical/convert_chemical_formats.py +0 -1
  36. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/types/api/entity/create_entities.py +1 -2
  37. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/types/api/entity/create_entity.py +2 -3
  38. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/types/api/entity/get_entities_data.py +0 -1
  39. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/types/api/entity/grant_entity_permissions.py +0 -1
  40. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/types/api/entity/list_entities.py +3 -4
  41. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/types/api/entity/lock_entity.py +0 -1
  42. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/types/api/entity/resolve_entity_ids.py +2 -3
  43. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/types/api/entity/set_entity_field_values.py +0 -1
  44. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/types/api/entity/set_values.py +0 -1
  45. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/types/api/entity/transition_entity_phase.py +1 -2
  46. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/types/api/entity/unlock_entity.py +0 -1
  47. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/types/api/equipment/associate_equipment_input.py +0 -1
  48. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/types/api/field_options/upsert_field_options.py +0 -1
  49. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/types/api/files/download_file.py +1 -2
  50. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/types/api/id_source/list_id_source.py +3 -4
  51. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/types/api/id_source/match_id_source.py +1 -2
  52. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/types/api/input_groups/get_input_group_names.py +0 -1
  53. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/types/api/inputs/create_inputs.py +2 -3
  54. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/types/api/inputs/get_input_data.py +5 -6
  55. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/types/api/inputs/get_input_names.py +3 -4
  56. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/types/api/inputs/get_inputs_data.py +0 -1
  57. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/types/api/inputs/set_input_attribute_values.py +0 -1
  58. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/types/api/inputs/set_input_category.py +1 -2
  59. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/types/api/inputs/set_input_subcategories.py +0 -1
  60. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/types/api/inputs/set_intermediate_type.py +1 -2
  61. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/types/api/material_families/update_entity_material_families.py +1 -2
  62. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/types/api/outputs/get_output_data.py +2 -3
  63. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/types/api/outputs/get_output_names.py +0 -1
  64. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/types/api/outputs/resolve_output_conditions.py +0 -1
  65. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/types/api/permissions/set_core_permissions.py +1 -2
  66. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/types/api/project/get_projects.py +3 -4
  67. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/types/api/project/get_projects_data.py +4 -5
  68. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/types/api/recipe_links/create_recipe_link.py +1 -2
  69. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/types/api/recipe_links/remove_recipe_link.py +1 -2
  70. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/types/api/recipe_metadata/get_recipe_metadata_data.py +3 -4
  71. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/types/api/recipes/add_recipe_to_project.py +0 -1
  72. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/types/api/recipes/archive_recipes.py +0 -1
  73. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/types/api/recipes/associate_recipe_as_input.py +0 -1
  74. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/types/api/recipes/associate_recipe_as_lot.py +0 -1
  75. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/types/api/recipes/clear_recipe_outputs.py +0 -1
  76. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/types/api/recipes/create_recipe.py +1 -2
  77. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/types/api/recipes/create_recipes.py +1 -2
  78. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/types/api/recipes/disassociate_recipe_as_input.py +0 -1
  79. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/types/api/recipes/edit_recipe_inputs.py +3 -4
  80. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/types/api/recipes/get_column_calculation_values.py +0 -1
  81. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/types/api/recipes/get_curve.py +0 -1
  82. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/types/api/recipes/get_recipe_calculations.py +0 -1
  83. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/types/api/recipes/get_recipe_links.py +1 -2
  84. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/types/api/recipes/get_recipe_names.py +0 -1
  85. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/types/api/recipes/get_recipe_output_metadata.py +0 -1
  86. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/types/api/recipes/get_recipes_data.py +13 -14
  87. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/types/api/recipes/lock_recipes.py +1 -2
  88. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/types/api/recipes/remove_recipe_from_project.py +0 -1
  89. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/types/api/recipes/set_recipe_inputs.py +1 -2
  90. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/types/api/recipes/set_recipe_metadata.py +0 -1
  91. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/types/api/recipes/set_recipe_output_annotations.py +2 -3
  92. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/types/api/recipes/set_recipe_output_file.py +0 -1
  93. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/types/api/recipes/set_recipe_outputs.py +3 -4
  94. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/types/api/recipes/set_recipe_tags.py +2 -3
  95. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/types/api/recipes/unarchive_recipes.py +0 -1
  96. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/types/api/recipes/unlock_recipes.py +1 -2
  97. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/types/api/triggers/run_trigger.py +0 -1
  98. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/types/api/uploader/invoke_uploader.py +0 -1
  99. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/types/async_batch.py +0 -1
  100. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/types/async_batch_processor.py +1 -2
  101. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/types/async_batch_t.py +1 -2
  102. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/types/async_jobs.py +0 -1
  103. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/types/async_jobs_t.py +1 -2
  104. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/types/auth_retrieval.py +0 -1
  105. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/types/auth_retrieval_t.py +2 -3
  106. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/types/base.py +0 -1
  107. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/types/base_t.py +2 -1
  108. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/types/calculations.py +0 -1
  109. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/types/calculations_t.py +0 -1
  110. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/types/chemical_structure.py +0 -1
  111. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/types/chemical_structure_t.py +0 -1
  112. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/types/client_base.py +29 -30
  113. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/types/client_config.py +0 -1
  114. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/types/client_config_t.py +1 -2
  115. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/types/curves.py +0 -1
  116. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/types/curves_t.py +2 -3
  117. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/types/entity.py +0 -1
  118. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/types/entity_t.py +3 -4
  119. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/types/experiment_groups.py +0 -1
  120. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/types/experiment_groups_t.py +0 -1
  121. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/types/field_values.py +0 -1
  122. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/types/field_values_t.py +6 -7
  123. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/types/fields.py +0 -1
  124. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/types/fields_t.py +0 -1
  125. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/types/generic_upload.py +0 -1
  126. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/types/generic_upload_t.py +2 -3
  127. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/types/id_source.py +0 -1
  128. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/types/id_source_t.py +1 -2
  129. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/types/identifier.py +0 -1
  130. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/types/identifier_t.py +1 -2
  131. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/types/input_attributes.py +0 -1
  132. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/types/input_attributes_t.py +0 -1
  133. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/types/inputs.py +0 -1
  134. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/types/inputs_t.py +2 -3
  135. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/types/integration_server.py +0 -1
  136. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/types/integration_server_t.py +1 -2
  137. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/types/job_definition.py +0 -1
  138. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/types/job_definition_t.py +5 -6
  139. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/types/outputs.py +0 -1
  140. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/types/outputs_t.py +1 -2
  141. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/types/overrides.py +0 -1
  142. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/types/overrides_t.py +0 -1
  143. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/types/permissions.py +0 -1
  144. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/types/permissions_t.py +1 -2
  145. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/types/phases.py +0 -1
  146. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/types/phases_t.py +0 -1
  147. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/types/post_base.py +0 -1
  148. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/types/post_base_t.py +1 -2
  149. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/types/queued_job.py +0 -1
  150. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/types/queued_job_t.py +2 -3
  151. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/types/recipe_identifiers.py +0 -1
  152. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/types/recipe_identifiers_t.py +1 -2
  153. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/types/recipe_inputs.py +0 -1
  154. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/types/recipe_inputs_t.py +1 -2
  155. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/types/recipe_links.py +0 -1
  156. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/types/recipe_links_t.py +2 -3
  157. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/types/recipe_metadata.py +0 -1
  158. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/types/recipe_metadata_t.py +0 -1
  159. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/types/recipe_output_metadata.py +0 -1
  160. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/types/recipe_output_metadata_t.py +0 -1
  161. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/types/recipe_tags.py +0 -1
  162. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/types/recipe_tags_t.py +0 -1
  163. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/types/recipe_workflow_steps.py +0 -1
  164. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/types/recipe_workflow_steps_t.py +2 -3
  165. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/types/recipes.py +0 -1
  166. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/types/recipes_t.py +0 -1
  167. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/types/response.py +0 -1
  168. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/types/response_t.py +0 -1
  169. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/types/secret_retrieval.py +0 -1
  170. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/types/secret_retrieval_t.py +2 -3
  171. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/types/units.py +0 -1
  172. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/types/units_t.py +0 -1
  173. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/types/users.py +0 -1
  174. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/types/users_t.py +0 -1
  175. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/types/webhook_job.py +0 -1
  176. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/types/webhook_job_t.py +0 -1
  177. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/types/workflows.py +0 -1
  178. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/types/workflows_t.py +1 -2
  179. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/.github/workflows/documentation.yml +0 -0
  180. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/.github/workflows/publish.yml +0 -0
  181. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/.gitignore +0 -0
  182. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/README.md +0 -0
  183. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/UncountablePythonSDK.egg-info/dependency_links.txt +0 -0
  184. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/UncountablePythonSDK.egg-info/top_level.txt +0 -0
  185. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/docs/.gitignore +0 -0
  186. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/docs/conf.py +0 -0
  187. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/docs/index.md +0 -0
  188. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/docs/justfile +0 -0
  189. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/docs/quickstart.md +0 -0
  190. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/docs/requirements.txt +0 -0
  191. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/docs/static/favicons/android-chrome-192x192.png +0 -0
  192. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/docs/static/favicons/android-chrome-512x512.png +0 -0
  193. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/docs/static/favicons/apple-touch-icon.png +0 -0
  194. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/docs/static/favicons/browserconfig.xml +0 -0
  195. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/docs/static/favicons/favicon-16x16.png +0 -0
  196. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/docs/static/favicons/favicon-32x32.png +0 -0
  197. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/docs/static/favicons/manifest.json +0 -0
  198. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/docs/static/favicons/mstile-150x150.png +0 -0
  199. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/docs/static/favicons/safari-pinned-tab.svg +0 -0
  200. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/docs/static/logo_blue.png +0 -0
  201. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/examples/async_batch.py +0 -0
  202. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/examples/create_entity.py +0 -0
  203. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/examples/download_files.py +0 -0
  204. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/examples/edit_recipe_inputs.py +0 -0
  205. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/examples/integration-server/jobs/materials_auto/example_cron.py +0 -0
  206. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/examples/integration-server/jobs/materials_auto/example_wh.py +0 -0
  207. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/examples/integration-server/jobs/materials_auto/profile.yaml +0 -0
  208. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/examples/integration-server/pyproject.toml +0 -0
  209. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/examples/invoke_uploader.py +0 -0
  210. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/examples/set_recipe_metadata_file.py +0 -0
  211. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/examples/set_recipe_output_file_sdk.py +0 -0
  212. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/examples/upload_files.py +0 -0
  213. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/pkgs/__init__.py +0 -0
  214. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/pkgs/argument_parser/__init__.py +0 -0
  215. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/pkgs/argument_parser/_is_enum.py +0 -0
  216. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/pkgs/argument_parser/_is_namedtuple.py +0 -0
  217. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/pkgs/argument_parser/case_convert.py +0 -0
  218. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/pkgs/filesystem_utils/__init__.py +0 -0
  219. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/pkgs/filesystem_utils/_blob_session.py +0 -0
  220. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/pkgs/filesystem_utils/_gdrive_session.py +0 -0
  221. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/pkgs/filesystem_utils/_local_session.py +0 -0
  222. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/pkgs/filesystem_utils/_sftp_session.py +0 -0
  223. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/pkgs/filesystem_utils/file_type_utils.py +0 -0
  224. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/pkgs/filesystem_utils/filesystem_session.py +0 -0
  225. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/pkgs/py.typed +0 -0
  226. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/pkgs/serialization/__init__.py +0 -0
  227. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/pkgs/serialization/opaque_key.py +0 -0
  228. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/pkgs/serialization/yaml.py +0 -0
  229. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/pkgs/serialization_util/__init__.py +0 -0
  230. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/pkgs/serialization_util/_get_type_for_serialization.py +0 -0
  231. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/pkgs/serialization_util/convert_to_snakecase.py +0 -0
  232. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/pkgs/serialization_util/dataclasses.py +0 -0
  233. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/pkgs/strenum_compat/__init__.py +0 -0
  234. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/pkgs/strenum_compat/strenum_compat.py +0 -0
  235. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/pkgs/type_spec/__init__.py +0 -0
  236. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/pkgs/type_spec/__main__.py +0 -0
  237. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/pkgs/type_spec/actions_registry/__init__.py +0 -0
  238. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/pkgs/type_spec/actions_registry/emit_typescript.py +0 -0
  239. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/pkgs/type_spec/emit_io_ts.py +0 -0
  240. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/pkgs/type_spec/emit_open_api_util.py +0 -0
  241. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/pkgs/type_spec/emit_typescript_util.py +0 -0
  242. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/pkgs/type_spec/load_types.py +0 -0
  243. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/pkgs/type_spec/open_api_util.py +0 -0
  244. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/pkgs/type_spec/parts/base.ts.prepart +0 -0
  245. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/pkgs/type_spec/test.py +0 -0
  246. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/pkgs/type_spec/type_info/__main__.py +0 -0
  247. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/pkgs/type_spec/type_info/emit_type_info.py +0 -0
  248. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/pkgs/type_spec/value_spec/__init__.py +0 -0
  249. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/pkgs/type_spec/value_spec/convert_type.py +0 -0
  250. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/setup.cfg +0 -0
  251. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/__init__.py +0 -0
  252. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/core/__init__.py +0 -0
  253. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/core/async_batch.py +0 -0
  254. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/core/environment.py +0 -0
  255. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/core/types.py +0 -0
  256. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/integration/__init__.py +0 -0
  257. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/integration/cli.py +0 -0
  258. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/integration/construct_client.py +0 -0
  259. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/integration/cron.py +0 -0
  260. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/integration/db/__init__.py +0 -0
  261. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/integration/db/connect.py +0 -0
  262. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/integration/db/session.py +0 -0
  263. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/integration/entrypoint.py +0 -0
  264. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/integration/executors/__init__.py +0 -0
  265. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/integration/executors/executors.py +0 -0
  266. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/integration/executors/generic_upload_executor.py +0 -0
  267. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/integration/executors/script_executor.py +0 -0
  268. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/integration/queue_runner/__init__.py +0 -0
  269. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/integration/queue_runner/command_server/__init__.py +0 -0
  270. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/integration/queue_runner/command_server/command_client.py +0 -0
  271. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/integration/queue_runner/command_server/command_server.py +0 -0
  272. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/integration/queue_runner/command_server/protocol/__init__.py +0 -0
  273. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/integration/queue_runner/command_server/protocol/command_server.proto +0 -0
  274. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/integration/queue_runner/command_server/protocol/command_server_pb2.py +0 -0
  275. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/integration/queue_runner/command_server/protocol/command_server_pb2.pyi +0 -0
  276. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/integration/queue_runner/command_server/protocol/command_server_pb2_grpc.py +0 -0
  277. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/integration/queue_runner/datastore/__init__.py +0 -0
  278. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/integration/queue_runner/datastore/datastore_sqlite.py +0 -0
  279. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/integration/queue_runner/datastore/interface.py +0 -0
  280. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/integration/queue_runner/datastore/model.py +0 -0
  281. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/integration/queue_runner/job_scheduler.py +0 -0
  282. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/integration/queue_runner/queue_runner.py +0 -0
  283. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/integration/queue_runner/types.py +0 -0
  284. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/integration/queue_runner/worker.py +0 -0
  285. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/integration/scan_profiles.py +0 -0
  286. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/integration/scheduler.py +0 -0
  287. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/integration/secret_retrieval/__init__.py +0 -0
  288. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/integration/secret_retrieval/retrieve_secret.py +0 -0
  289. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/integration/telemetry.py +0 -0
  290. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/integration/webhook_server/entrypoint.py +0 -0
  291. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/py.typed +0 -0
  292. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/types/api/__init__.py +0 -0
  293. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/types/api/batch/__init__.py +0 -0
  294. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/types/api/chemical/__init__.py +0 -0
  295. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/types/api/entity/__init__.py +0 -0
  296. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/types/api/equipment/__init__.py +0 -0
  297. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/types/api/field_options/__init__.py +0 -0
  298. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/types/api/files/__init__.py +0 -0
  299. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/types/api/id_source/__init__.py +0 -0
  300. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/types/api/input_groups/__init__.py +0 -0
  301. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/types/api/inputs/__init__.py +0 -0
  302. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/types/api/material_families/__init__.py +0 -0
  303. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/types/api/outputs/__init__.py +0 -0
  304. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/types/api/permissions/__init__.py +0 -0
  305. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/types/api/project/__init__.py +0 -0
  306. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/types/api/recipe_links/__init__.py +0 -0
  307. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/types/api/recipe_metadata/__init__.py +0 -0
  308. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/types/api/recipes/__init__.py +0 -0
  309. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/types/api/triggers/__init__.py +0 -0
  310. {uncountablepythonsdk-0.0.92 → uncountablepythonsdk-0.0.95}/uncountable/types/api/uploader/__init__.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: UncountablePythonSDK
3
- Version: 0.0.92
3
+ Version: 0.0.95
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
@@ -38,6 +38,7 @@ Requires-Dist: simplejson==3.*
38
38
  Requires-Dist: grpcio==1.67.1
39
39
  Requires-Dist: protobuf>=4.21.1
40
40
  Requires-Dist: azure-storage-blob==12.*
41
+ Requires-Dist: boto3-stubs[essential,ses]==1.36.4
41
42
  Provides-Extra: test
42
43
  Requires-Dist: mypy==1.*; extra == "test"
43
44
  Requires-Dist: ruff==0.*; extra == "test"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: UncountablePythonSDK
3
- Version: 0.0.92
3
+ Version: 0.0.95
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
@@ -38,6 +38,7 @@ Requires-Dist: simplejson==3.*
38
38
  Requires-Dist: grpcio==1.67.1
39
39
  Requires-Dist: protobuf>=4.21.1
40
40
  Requires-Dist: azure-storage-blob==12.*
41
+ Requires-Dist: boto3-stubs[essential,ses]==1.36.4
41
42
  Provides-Extra: test
42
43
  Requires-Dist: mypy==1.*; extra == "test"
43
44
  Requires-Dist: ruff==0.*; extra == "test"
@@ -61,6 +61,7 @@ pkgs/serialization/serial_generic.py
61
61
  pkgs/serialization/serial_union.py
62
62
  pkgs/serialization/yaml.py
63
63
  pkgs/serialization_util/__init__.py
64
+ pkgs/serialization_util/_env_flags.py
64
65
  pkgs/serialization_util/_get_type_for_serialization.py
65
66
  pkgs/serialization_util/convert_to_snakecase.py
66
67
  pkgs/serialization_util/dataclasses.py
@@ -20,6 +20,7 @@ simplejson==3.*
20
20
  grpcio==1.67.1
21
21
  protobuf>=4.21.1
22
22
  azure-storage-blob==12.*
23
+ boto3-stubs[essential,ses]==1.36.4
23
24
 
24
25
  [test]
25
26
  mypy==1.*
@@ -96,7 +96,7 @@ def is_missing(field_type: typing.Any) -> bool:
96
96
  return not (len(args) == 0 or args[0] is not MissingSentryType)
97
97
 
98
98
 
99
- def _invoke_tuple_parsers(
99
+ def _invoke_tuple_parsers[T](
100
100
  tuple_type: type[T],
101
101
  arg_parsers: typing.Sequence[typing.Callable[[typing.Any], object]],
102
102
  has_ellipsis: bool,
@@ -133,7 +133,7 @@ def _invoke_fallback_parsers(
133
133
  ) from ExceptionGroup("Fallback Parser Exception", exceptions)
134
134
 
135
135
 
136
- def _invoke_membership_parser(
136
+ def _invoke_membership_parser[T](
137
137
  expected_values: set[T],
138
138
  value: typing.Any,
139
139
  ) -> T:
@@ -148,7 +148,7 @@ def _invoke_membership_parser(
148
148
  raise ValueError(f"Expected value from {expected_values} but got value {value}")
149
149
 
150
150
 
151
- def _build_parser_discriminated_union(
151
+ def _build_parser_discriminated_union[T](
152
152
  context: ParserContext,
153
153
  discriminator: str,
154
154
  discriminator_map: dict[str, ParserFunction[T]],
@@ -170,7 +170,7 @@ def _build_parser_discriminated_union(
170
170
  return parse
171
171
 
172
172
 
173
- def _build_parser_inner(
173
+ def _build_parser_inner[T](
174
174
  parsed_type: type[T],
175
175
  context: ParserContext,
176
176
  ) -> ParserFunction[T]:
@@ -368,7 +368,7 @@ def _build_parser_inner(
368
368
  raise ValueError(f"Unhandled type {parsed_type}")
369
369
 
370
370
 
371
- def _build_parser_dataclass(
371
+ def _build_parser_dataclass[T](
372
372
  parsed_type: type[T],
373
373
  context: ParserContext,
374
374
  ) -> ParserFunction[T]:
@@ -479,7 +479,7 @@ def _build_parser_dataclass(
479
479
  _CACHE_MAP: dict[ParserOptions, ParserCache] = defaultdict(ParserCache)
480
480
 
481
481
 
482
- def build_parser(
482
+ def build_parser[T](
483
483
  parsed_type: type[T],
484
484
  options: ParserOptions,
485
485
  ) -> ParserFunction[T]:
@@ -501,7 +501,7 @@ def build_parser(
501
501
  return built_parser
502
502
 
503
503
 
504
- class CachedParser(typing.Generic[T]):
504
+ class CachedParser[T]:
505
505
  def __init__(
506
506
  self,
507
507
  args: type[T],
@@ -1,6 +1,7 @@
1
1
  from io import BytesIO
2
2
 
3
3
  from boto3.session import Session
4
+ from mypy_boto3_s3.service_resource import Bucket
4
5
 
5
6
  from pkgs.filesystem_utils.file_type_utils import (
6
7
  FileObjectData,
@@ -37,7 +38,7 @@ class S3Session(FileSystemSession):
37
38
  aws_session_token=self.config.session_token,
38
39
  )
39
40
 
40
- self.bucket = s3_resource.Bucket(self.config.bucket_name)
41
+ self.bucket: Bucket | None = s3_resource.Bucket(self.config.bucket_name)
41
42
 
42
43
  def __enter__(self) -> "S3Session":
43
44
  self.start()
@@ -16,7 +16,7 @@ class SerialBase:
16
16
  from_decorator: bool = False
17
17
 
18
18
 
19
- def get_serial_annotation(parsed_type: type[T]) -> SerialBase | None:
19
+ def get_serial_annotation[T](parsed_type: type[T]) -> SerialBase | None:
20
20
  if not hasattr(parsed_type, "__metadata__"):
21
21
  return None
22
22
  metadata = parsed_type.__metadata__ # type:ignore[attr-defined]
@@ -28,7 +28,7 @@ def get_serial_annotation(parsed_type: type[T]) -> SerialBase | None:
28
28
  return serial
29
29
 
30
30
 
31
- class SerialInspector(typing.Generic[T]):
31
+ class SerialInspector[T]:
32
32
  def __init__(self, parsed_type: type[T], serial_base: SerialBase) -> None:
33
33
  self._parsed_type = parsed_type
34
34
  self._serial_base = serial_base
@@ -53,7 +53,7 @@ class SerialInspector(typing.Generic[T]):
53
53
  return self._serial_base.is_dynamic_allowed
54
54
 
55
55
 
56
- def unwrap_annotated(parsed_type: type[T]) -> type[T]:
56
+ def unwrap_annotated[T](parsed_type: type[T]) -> type[T]:
57
57
  """
58
58
  If the type is an annotated type then return the origin of it.
59
59
  Otherwise return the original type.
@@ -26,5 +26,5 @@ MISSING_SENTRY = MissingSentryType()
26
26
  MissingType = Union[MissingSentryType, ClassT]
27
27
 
28
28
 
29
- def coalesce_missing_sentry(value: MissingType[ClassT]) -> ClassT | None:
29
+ def coalesce_missing_sentry[ClassT](value: MissingType[ClassT]) -> ClassT | None:
30
30
  return None if isinstance(value, MissingSentryType) else value
@@ -26,7 +26,7 @@ def serial_alias_annotation(
26
26
  )
27
27
 
28
28
 
29
- def _get_serial_alias(parsed_type: type[T]) -> _SerialAlias | None:
29
+ def _get_serial_alias[T](parsed_type: type[T]) -> _SerialAlias | None:
30
30
  serial = get_serial_annotation(parsed_type)
31
31
  if not isinstance(serial, _SerialAlias):
32
32
  return None
@@ -39,7 +39,7 @@ class SerialAliasInspector(SerialInspector[T]):
39
39
  self._serial_alias = serial_alias
40
40
 
41
41
 
42
- def get_serial_alias_data(parsed_type: type[T]) -> SerialAliasInspector[T] | None:
42
+ def get_serial_alias_data[T](parsed_type: type[T]) -> SerialAliasInspector[T] | None:
43
43
  serial = _get_serial_alias(parsed_type)
44
44
  if serial is None:
45
45
  return None
@@ -119,7 +119,7 @@ def get_merged_serial_class_data(type_class: type[Any]) -> _SerialClassData | No
119
119
  return base_class_data
120
120
 
121
121
 
122
- def get_serial_class_data(
122
+ def get_serial_class_data[_ClassT](
123
123
  type_class: type[_ClassT],
124
124
  ) -> SerialClassDataInspector[_ClassT]:
125
125
  return SerialClassDataInspector(
@@ -6,7 +6,7 @@ from .serial_class import get_merged_serial_class_data
6
6
  T = typing.TypeVar("T")
7
7
 
8
8
 
9
- def get_serial_data(parsed_type: type[T]) -> SerialInspector[T] | None:
9
+ def get_serial_data[T](parsed_type: type[T]) -> SerialInspector[T] | None:
10
10
  serial = get_serial_annotation(parsed_type)
11
11
  if serial is None:
12
12
  serial = get_merged_serial_class_data(parsed_type)
@@ -6,7 +6,7 @@ from .annotation import SerialBase, SerialInspector, get_serial_annotation
6
6
  T = typing.TypeVar("T")
7
7
 
8
8
 
9
- class IdentityHashWrapper(typing.Generic[T]):
9
+ class IdentityHashWrapper[T]:
10
10
  """This allows unhashable types to be used in the SerialUnion, like dict.
11
11
  Since we have only one copy of the types themselves, we rely on
12
12
  object identity for the hashing."""
@@ -49,7 +49,7 @@ def serial_union_annotation(
49
49
  )
50
50
 
51
51
 
52
- def _get_serial_union(parsed_type: type[T]) -> _SerialUnion | None:
52
+ def _get_serial_union[T](parsed_type: type[T]) -> _SerialUnion | None:
53
53
  serial = get_serial_annotation(parsed_type)
54
54
  if not isinstance(serial, _SerialUnion):
55
55
  return None
@@ -76,7 +76,7 @@ class SerialClassInspector(SerialInspector[T]):
76
76
  return self._serial_union.discriminator_map.inner
77
77
 
78
78
 
79
- def get_serial_union_data(parsed_type: type[T]) -> SerialClassInspector[T] | None:
79
+ def get_serial_union_data[T](parsed_type: type[T]) -> SerialClassInspector[T] | None:
80
80
  serial = _get_serial_union(parsed_type)
81
81
  if serial is None:
82
82
  return None
@@ -0,0 +1,3 @@
1
+ import os
2
+
3
+ USE_FASTJSON: bool = os.environ.get("USE_FASTJSON", "false").lower() == "true"
@@ -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
  )
@@ -24,6 +23,7 @@ from pkgs.serialization import (
24
23
  get_serial_class_data,
25
24
  )
26
25
 
26
+ from ._env_flags import USE_FASTJSON
27
27
  from ._get_type_for_serialization import SerializationType, get_serialization_type
28
28
  from .dataclasses import iterate_fields
29
29
 
@@ -34,14 +34,12 @@ if TYPE_CHECKING:
34
34
  else:
35
35
  JsonValue = Union[JsonScalar, dict[str, Any], list[Any]]
36
36
 
37
- T = TypeVar("T")
38
-
39
37
 
40
38
  class Dataclass(Protocol):
41
39
  __dataclass_fields__: ClassVar[dict] # type: ignore[type-arg,unused-ignore]
42
40
 
43
41
 
44
- def identity(x: T) -> T:
42
+ def identity[T](x: T) -> T:
45
43
  return x
46
44
 
47
45
 
@@ -112,7 +110,9 @@ def _get_dataclass_conversion_lookups(dataclass_type: Any) -> DataclassConversio
112
110
  if scd.has_to_string_value(key):
113
111
  value_conversion_functions[key] = _to_string_value
114
112
  elif scd.has_unconverted_value(key):
115
- value_conversion_functions[key] = identity
113
+ value_conversion_functions[key] = (
114
+ serialize_for_storage if USE_FASTJSON else identity
115
+ )
116
116
  else:
117
117
  value_conversion_functions[key] = serialize_for_api
118
118
 
@@ -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
 
@@ -901,16 +901,9 @@ class SpecEndpoint:
901
901
  account_type: str | None
902
902
  route_group: str | None
903
903
 
904
- # to be deprecated in favor of path_per_api_endpoint:
905
- # default function, path details
906
- function: str | None
907
- root: EndpointKey
908
- path_root: str
909
- path_dirname: str
910
- path_basename: str
911
-
912
904
  # function, path details per api endpoint
913
905
  path_per_api_endpoint: dict[str, EndpointSpecificPath]
906
+ default_endpoint_key: EndpointKey
914
907
 
915
908
  is_external: bool = False
916
909
 
@@ -997,14 +990,18 @@ class SpecEndpoint:
997
990
  self.has_attachment = data.get("has_attachment", False)
998
991
  self.desc = data.get("desc")
999
992
 
993
+ # compatibility with single-endpoint files
1000
994
  default_endpoint_path = parse_endpoint_specific_path(
1001
995
  builder,
1002
996
  {"path": data.get("path"), "function": data.get("function")},
1003
997
  )
1004
998
  if default_endpoint_path is not None:
1005
- self.root = default_endpoint_path.root
999
+ assert default_endpoint_path.root in builder.api_endpoints, (
1000
+ "Default endpoint is not a valid API endpoint"
1001
+ )
1002
+ self.default_endpoint_key = default_endpoint_path.root
1006
1003
  self.path_per_api_endpoint = {
1007
- self.root: default_endpoint_path,
1004
+ self.default_endpoint_key: default_endpoint_path,
1008
1005
  }
1009
1006
  else:
1010
1007
  self.path_per_api_endpoint = {}
@@ -1021,27 +1018,34 @@ class SpecEndpoint:
1021
1018
  if shared_function_name is None:
1022
1019
  shared_function_name = fn_name
1023
1020
  assert shared_function_name == fn_name
1024
- assert self.path_per_api_endpoint != {}
1025
1021
 
1026
- assert builder.top_namespace in self.path_per_api_endpoint
1027
- self.root = builder.top_namespace
1022
+ if builder.top_namespace in self.path_per_api_endpoint:
1023
+ self.default_endpoint_key = builder.top_namespace
1024
+ elif len(self.path_per_api_endpoint) == 1:
1025
+ self.default_endpoint_key = next(
1026
+ iter(self.path_per_api_endpoint.keys())
1027
+ )
1028
+ else:
1029
+ raise RuntimeError("no clear default endpoint")
1028
1030
 
1029
- default_endpoint_path = self.path_per_api_endpoint[self.root]
1030
- self.function = default_endpoint_path.function
1031
- self.path_dirname = default_endpoint_path.path_dirname
1032
- self.path_basename = default_endpoint_path.path_basename
1033
- self.path_root = default_endpoint_path.path_root
1031
+ assert len(self.path_per_api_endpoint) > 0, (
1032
+ "Missing API endpoint path and function definitions for API call"
1033
+ )
1034
1034
 
1035
1035
  # IMPROVE: remove need for is_external flag
1036
- self.is_external = self.path_root == "api/external"
1036
+ self.is_external = (
1037
+ self.path_per_api_endpoint[self.default_endpoint_key].path_root
1038
+ == "api/external"
1039
+ )
1037
1040
 
1038
1041
  assert self.is_sdk != EndpointEmitType.EMIT_ENDPOINT or self.desc is not None, (
1039
- f"Endpoint description required for SDK endpoints, missing: {self.path_dirname}/{self.path_basename}"
1042
+ f"Endpoint description required for SDK endpoints, missing: {self.resolved_path}"
1040
1043
  )
1041
1044
 
1042
1045
  @property
1043
1046
  def resolved_path(self: Self) -> str:
1044
- return f"{self.path_root}/{self.path_dirname}/{self.path_basename}"
1047
+ default_endpoint_path = self.path_per_api_endpoint[self.default_endpoint_key]
1048
+ return f"{default_endpoint_path.path_root}/{default_endpoint_path.path_dirname}/{default_endpoint_path.path_basename}"
1045
1049
 
1046
1050
 
1047
1051
  def _parse_const(
@@ -1,7 +1,7 @@
1
1
  import os
2
2
  from collections.abc import Callable, Mapping
3
3
  from dataclasses import dataclass
4
- from typing import Self, TypeVar
4
+ from typing import Self
5
5
 
6
6
  from pkgs.serialization import yaml
7
7
 
@@ -103,10 +103,7 @@ class Config:
103
103
  open_api: OpenAPIConfig | None
104
104
 
105
105
 
106
- _T = TypeVar("_T")
107
-
108
-
109
- def _parse_language(config_class: type[_T], raw_value: ConfigValueType) -> _T:
106
+ def _parse_language[_T](config_class: type[_T], raw_value: ConfigValueType) -> _T:
110
107
  assert isinstance(raw_value, dict), "expecting language config to have key/values."
111
108
  return config_class(**raw_value)
112
109
 
@@ -563,7 +563,7 @@ def _emit_endpoint(
563
563
  ep = namespace.endpoint
564
564
  gctx.paths.append(
565
565
  EmitOpenAPIPath(
566
- path=f"/{ep.path_root}/{ep.path_dirname}/{ep.path_basename}",
566
+ path=f"/{ep.resolved_path}",
567
567
  ref=ref_path,
568
568
  )
569
569
  )
@@ -5,16 +5,14 @@ from decimal import Decimal
5
5
  from typing import Any
6
6
 
7
7
  from . import builder, util
8
- from .builder import EndpointEmitType
8
+ from .builder import EndpointEmitType, EndpointSpecificPath
9
9
  from .config import PythonConfig
10
10
 
11
11
  INDENT = " "
12
12
  LINE_BREAK = "\n"
13
13
  MODIFY_NOTICE = "# DO NOT MODIFY -- This file is generated by type_spec\n"
14
14
  # Turn excess line length warning and turn off ruff formatting
15
- LINT_HEADER = (
16
- "# flake8: noqa: F821\n# ruff: noqa: E402 Q003\n# fmt: off\n# isort: skip_file\n"
17
- )
15
+ LINT_HEADER = "# ruff: noqa: E402 Q003\n# fmt: off\n# isort: skip_file\n"
18
16
  LINT_FOOTER = "# fmt: on\n"
19
17
  ROUTE_NOTICE = """# Routes are generated from $endpoint specifications in the
20
18
  # type_spec API YAML files. Refer to the section on endpoints in the type_spec/README"""
@@ -221,7 +219,7 @@ def _emit_types_imports(*, out: io.StringIO, ctx: Context) -> None:
221
219
  out.write("import datetime # noqa: F401\n")
222
220
  out.write("from decimal import Decimal # noqa: F401\n")
223
221
  if ctx.use_enum:
224
- out.write("from pkgs.strenum_compat import StrEnum\n")
222
+ out.write("from enum import StrEnum\n")
225
223
  if ctx.use_dataclass:
226
224
  out.write("import dataclasses\n")
227
225
  out.write("from pkgs.serialization import serial_class\n")
@@ -349,13 +347,17 @@ ENDPOINT_PATH = "ENDPOINT_PATH"
349
347
  ENDPOINT_PATH_ALTERNATE = "ENDPOINT_PATH_ALTERNATE"
350
348
 
351
349
 
350
+ def _get_epf_root(endpoint_specific_path: EndpointSpecificPath) -> str:
351
+ return endpoint_specific_path.root
352
+
353
+
352
354
  def _emit_namespace(ctx: Context, namespace: builder.SpecNamespace) -> None:
353
355
  endpoint = namespace.endpoint
354
356
  if endpoint is not None:
355
357
  ctx.out.write("\n")
356
358
  ctx.out.write(f'{ENDPOINT_METHOD} = "{endpoint.method.upper()}"\n')
357
359
  for endpoint_specific_path in sorted(
358
- endpoint.path_per_api_endpoint.values(), key=lambda epf: epf.root
360
+ endpoint.path_per_api_endpoint.values(), key=_get_epf_root
359
361
  ):
360
362
  endpoint_path_name = ENDPOINT_PATH
361
363
 
@@ -457,8 +459,10 @@ def _emit_endpoint_invocation_function_signature(
457
459
  else []
458
460
  ) + (extra_params if extra_params is not None else [])
459
461
 
460
- assert endpoint.function is not None
461
- function_name = endpoint.function.split(".")[-1]
462
+ # All endpoints share a function name
463
+ function = endpoint.path_per_api_endpoint[endpoint.default_endpoint_key].function
464
+ assert function is not None
465
+ function_name = function.split(".")[-1]
462
466
  ctx.out.write(
463
467
  f"""
464
468
  def {function_name}(
@@ -716,40 +720,43 @@ def _emit_properties(
716
720
  if len(properties) > 0:
717
721
 
718
722
  def write_field(prop: builder.SpecProperty) -> None:
723
+ stype = prop.spec_type
719
724
  if prop.name_case == builder.NameCase.preserve:
720
725
  unconverted_keys.add(prop.name)
721
726
  py_name = python_field_name(prop.name, prop.name_case)
722
727
 
723
728
  if prop.convert_value == builder.PropertyConvertValue.no_convert:
724
729
  unconverted_values.add(py_name)
725
- elif not prop.spec_type.is_value_converted():
730
+ elif not stype.is_value_converted():
726
731
  assert prop.convert_value == builder.PropertyConvertValue.auto
727
732
  unconverted_values.add(py_name)
728
- if prop.spec_type.is_value_to_string():
733
+ if stype.is_value_to_string():
729
734
  to_string_values.add(py_name)
730
735
 
731
736
  if prop.parse_require:
732
737
  parse_require.add(py_name)
733
738
 
734
- ref_type = refer_to(ctx, prop.spec_type)
739
+ ref_type = refer_to(ctx, stype)
735
740
  default = None
736
741
  if prop.extant == builder.PropertyExtant.missing:
737
742
  ref_type = f"MissingType[{ref_type}]"
738
743
  default = "MISSING_SENTRY"
739
744
  ctx.use_missing = True
740
745
  elif prop.extant == builder.PropertyExtant.optional:
741
- if ref_type != "None":
746
+ if isinstance(
747
+ stype, builder.SpecTypeInstance
748
+ ) and stype.defn_type.is_base_type(builder.BaseTypeName.s_optional):
749
+ pass # base type already adds the None union
750
+ elif ref_type == "None":
751
+ pass # no need to add a None union to a none type
752
+ else:
742
753
  ref_type = f"{ref_type} | None"
743
754
  default = "None"
744
755
  elif prop.has_default:
745
- default = _emit_value(ctx, prop.spec_type, prop.default)
756
+ default = _emit_value(ctx, stype, prop.default)
746
757
  if (
747
- isinstance(prop.spec_type, builder.SpecTypeInstance)
748
- and (
749
- prop.spec_type.defn_type.is_base_type(
750
- builder.BaseTypeName.s_list
751
- )
752
- )
758
+ isinstance(stype, builder.SpecTypeInstance)
759
+ and (stype.defn_type.is_base_type(builder.BaseTypeName.s_list))
753
760
  and default == "[]"
754
761
  ):
755
762
  default = "dataclasses.field(default_factory=list)"
@@ -939,13 +946,22 @@ base_name_map = {
939
946
 
940
947
  def refer_to(ctx: TrackingContext, stype: builder.SpecType) -> str:
941
948
  if isinstance(stype, builder.SpecTypeInstance):
942
- params = ", ".join([refer_to(ctx, p) for p in stype.parameters])
949
+ params = [refer_to(ctx, p) for p in stype.parameters]
950
+
951
+ if stype.defn_type.is_base_type(builder.BaseTypeName.s_union):
952
+ if len(stype.parameters) == 1:
953
+ return f"typing.Union[{params[0]}]"
954
+ return " | ".join(params)
943
955
 
944
956
  if stype.defn_type.is_base_type(builder.BaseTypeName.s_readonly_array):
945
- assert len(stype.parameters) == 1, "Read Only Array takes one parameter"
946
- params = f"{params}, ..."
957
+ assert len(params) == 1, "Read Only Array takes one parameter"
958
+ return f"tuple[{params[0]}, ...]"
959
+
960
+ if stype.defn_type.is_base_type(builder.BaseTypeName.s_optional):
961
+ assert len(params) == 1, "Optional only takes one parameter"
962
+ return f"{params[0]} | None"
947
963
 
948
- return f"{refer_to(ctx, stype.defn_type)}[{params}]"
964
+ return f"{refer_to(ctx, stype.defn_type)}[{', '.join(params)}]"
949
965
 
950
966
  if isinstance(stype, builder.SpecTypeLiteralWrapper):
951
967
  return _emit_value(ctx, stype.value_type, stype.value)
@@ -1111,8 +1127,8 @@ def _emit_id_source(*, builder: builder.SpecBuilder, config: PythonConfig) -> No
1111
1127
  return None
1112
1128
  enum_out = io.StringIO()
1113
1129
  enum_out.write(f"{LINT_HEADER}{MODIFY_NOTICE}\n")
1114
- enum_out.write("from typing import Literal, Union\n")
1115
- enum_out.write("from pkgs.strenum_compat import StrEnum\n")
1130
+ enum_out.write("import typing\n")
1131
+ enum_out.write("from enum import StrEnum\n")
1116
1132
 
1117
1133
  ctx = TrackingContext()
1118
1134
  # In this context the propername
@@ -1128,11 +1144,11 @@ def _emit_id_source(*, builder: builder.SpecBuilder, config: PythonConfig) -> No
1128
1144
  known_keys = []
1129
1145
  enum_out.write("\nENUM_MAP: dict[str, type[StrEnum]] = {\n")
1130
1146
  for key in sorted(named_enums.keys()):
1131
- enum_out.write(f'"{key}": {named_enums[key]},\n')
1132
- known_keys.append(f'Literal["{key}"]')
1147
+ enum_out.write(f'{INDENT}"{key}": {named_enums[key]},\n')
1148
+ known_keys.append(f'"{key}"')
1133
1149
  enum_out.write(f"}}\n{MODIFY_NOTICE}\n")
1134
1150
 
1135
- enum_out.write(f"\nKnownEnumsType = Union[\n{INDENT}")
1151
+ enum_out.write(f"\nKnownEnumsType = typing.Literal[\n{INDENT}")
1136
1152
  enum_out.write(f",\n{INDENT}".join(known_keys))
1137
1153
  enum_out.write(f"\n]\n{MODIFY_NOTICE}\n")
1138
1154
 
@@ -2,6 +2,7 @@ import io
2
2
  import os
3
3
 
4
4
  from . import builder, util
5
+ from .builder import EndpointKey, EndpointSpecificPath
5
6
  from .config import TypeScriptConfig
6
7
  from .emit_io_ts import emit_type_io_ts
7
8
  from .emit_typescript_util import (
@@ -46,7 +47,10 @@ def _emit_types(builder: builder.SpecBuilder, config: TypeScriptConfig) -> None:
46
47
  and len(namespace.constants) == 0
47
48
  ):
48
49
  # Try to capture some common incompleteness errors
49
- if namespace.endpoint is None or namespace.endpoint.function is None:
50
+ if namespace.endpoint is None or any(
51
+ endpoint_specific_path.function is None
52
+ for endpoint_specific_path in namespace.endpoint.path_per_api_endpoint.values()
53
+ ):
50
54
  raise Exception(
51
55
  f"Namespace {'/'.join(namespace.path)} is incomplete. It should have an endpoint with function, types, and/or constants"
52
56
  )
@@ -209,12 +213,15 @@ export type Response = DeprecatedResult
209
213
 
210
214
  """
211
215
 
212
- endpoint_path_part = (
213
- f'"{endpoint.path_root}/{endpoint.path_dirname}/{endpoint.path_basename}",'
214
- )
215
-
216
- if has_multiple_endpoints:
216
+ if not has_multiple_endpoints:
217
+ default_endpoint_path = endpoint.path_per_api_endpoint[
218
+ endpoint.default_endpoint_key
219
+ ]
220
+ endpoint_path_part = f'"{default_endpoint_path.path_root}/{default_endpoint_path.path_dirname}/{default_endpoint_path.path_basename}",'
221
+ else:
217
222
  path_lookup_map = ""
223
+ api_endpoint_key: EndpointKey
224
+ endpoint_specific_path: EndpointSpecificPath
218
225
  for (
219
226
  api_endpoint_key,
220
227
  endpoint_specific_path,
@@ -22,6 +22,8 @@ PureJsonScalar = Union[str, float, bool, None]
22
22
  # Regular expressions for identifying ref names and IDs. Ref names should be
23
23
  # using this regular expression as a constriant in the database.
24
24
  REF_NAME_REGEX = r"^[a-zA-Z0-9_/-]+$"
25
+ REF_NAME_STRICT_REGEX_STRING = "^[a-zA-Z_][a-zA-Z0-9_]*$"
26
+ REF_NAME_STRICT_REGEX = rf"{REF_NAME_STRICT_REGEX_STRING}"
25
27
  # Ids matching a strict integer number are converted to integers
26
28
  ID_REGEX = r"-?[1-9][0-9]{0,20}"
27
29
 
@@ -1,12 +1,10 @@
1
1
  import json
2
2
  import os
3
3
  from dataclasses import dataclass
4
- from typing import TypeVar, Union
4
+ from typing import Union
5
5
 
6
6
  import regex as re
7
7
 
8
- T = TypeVar("T")
9
-
10
8
 
11
9
  def rewrite_file(filename: str, content: str) -> bool:
12
10
  os.makedirs(os.path.dirname(filename), exist_ok=True)
@@ -156,7 +154,7 @@ def is_valid_property_name(name: str) -> bool:
156
154
  return re_pattern_property_name.match(name) is not None
157
155
 
158
156
 
159
- def check_fields(data: dict[str, T], allowed: list[str]) -> None:
157
+ def check_fields[T](data: dict[str, T], allowed: list[str]) -> None:
160
158
  for key in data:
161
159
  if key not in allowed:
162
160
  raise Exception(f"unexpected-field: {key}. Allowed: {allowed}")
@@ -180,7 +178,7 @@ def encode_common_string(value: str) -> str:
180
178
  return rep
181
179
 
182
180
 
183
- def unused(_arg: T) -> None:
181
+ def unused[T](_arg: T) -> None:
184
182
  """
185
183
  Identifies that an argument is intended not be used, as opposed to
186
184
  simply forgotten, or a remnant. This can happen in patterned calls