UncountablePythonSDK 0.0.149__tar.gz → 0.0.151__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.
Files changed (388) hide show
  1. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/.github/workflows/documentation.yml +1 -1
  2. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/.github/workflows/publish.yml +1 -1
  3. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/PKG-INFO +3 -3
  4. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/UncountablePythonSDK.egg-info/PKG-INFO +3 -3
  5. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/UncountablePythonSDK.egg-info/SOURCES.txt +6 -0
  6. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/UncountablePythonSDK.egg-info/requires.txt +2 -2
  7. uncountablepythonsdk-0.0.151/docs/requirements.txt +9 -0
  8. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/examples/integration-server/jobs/materials_auto/example_parse.py +57 -1
  9. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/examples/integration-server/pyproject.toml +1 -1
  10. uncountablepythonsdk-0.0.151/examples/set_input_pdf_attribute.py +67 -0
  11. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/pkgs/argument_parser/__init__.py +1 -0
  12. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/pkgs/argument_parser/argument_parser.py +9 -0
  13. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/pkgs/filesystem_utils/__init__.py +2 -0
  14. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/pkgs/filesystem_utils/_blob_session.py +2 -1
  15. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/pkgs/filesystem_utils/_gdrive_session.py +2 -2
  16. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/pkgs/filesystem_utils/_local_session.py +2 -1
  17. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/pkgs/filesystem_utils/_s3_session.py +21 -7
  18. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/pkgs/filesystem_utils/_sftp_session.py +2 -1
  19. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/pkgs/serialization/__init__.py +1 -0
  20. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/pkgs/serialization/missing_sentry.py +1 -1
  21. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/pkgs/serialization/opaque_key.py +4 -1
  22. uncountablepythonsdk-0.0.151/pkgs/serialization/unknown.py +4 -0
  23. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/pkgs/type_spec/builder.py +7 -0
  24. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/pkgs/type_spec/emit_io_ts.py +1 -0
  25. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/pkgs/type_spec/emit_python.py +2 -0
  26. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/pkgs/type_spec/emit_typescript_util.py +1 -0
  27. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/pkgs/type_spec/parts/base.py.prepart +4 -1
  28. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/pkgs/type_spec/parts/base.ts.prepart +2 -0
  29. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/pkgs/type_spec/type_info/emit_type_info.py +4 -4
  30. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/pkgs/type_spec/value_spec/emit_python.py +5 -0
  31. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/pyproject.toml +2 -2
  32. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/integration/cli.py +43 -0
  33. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/integration/queue_runner/command_server/command_client.py +15 -0
  34. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/integration/queue_runner/command_server/command_server.py +14 -1
  35. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/integration/queue_runner/command_server/protocol/command_server.proto +3 -0
  36. uncountablepythonsdk-0.0.151/uncountable/integration/queue_runner/command_server/protocol/command_server_pb2.py +74 -0
  37. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/integration/queue_runner/command_server/protocol/command_server_pb2.pyi +28 -9
  38. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/integration/queue_runner/command_server/protocol/command_server_pb2_grpc.py +36 -0
  39. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/integration/queue_runner/datastore/datastore_sqlite.py +16 -0
  40. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/integration/queue_runner/datastore/interface.py +5 -0
  41. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/integration/server.py +2 -2
  42. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/integration/telemetry.py +2 -2
  43. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/__init__.py +6 -0
  44. uncountablepythonsdk-0.0.151/uncountable/types/api/file_folders/modify_file_system.py +98 -0
  45. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/api/notebooks/add_notebook_content.py +145 -1
  46. uncountablepythonsdk-0.0.151/uncountable/types/api/outputs/update_output_condition_parameter.py +56 -0
  47. uncountablepythonsdk-0.0.151/uncountable/types/api/permissions/set_entity_permission.py +115 -0
  48. uncountablepythonsdk-0.0.151/uncountable/types/api/user/__init__.py +1 -0
  49. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/async_batch_processor.py +75 -0
  50. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/async_batch_t.py +2 -0
  51. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/base.py +1 -0
  52. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/base_t.py +5 -1
  53. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/client_base.py +109 -0
  54. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/entity_t.py +9 -1
  55. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/inputs_t.py +4 -0
  56. uncountablepythonsdk-0.0.149/docs/requirements.txt +0 -9
  57. uncountablepythonsdk-0.0.149/uncountable/integration/queue_runner/command_server/protocol/command_server_pb2.py +0 -63
  58. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/.gitignore +0 -0
  59. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/.python-version +0 -0
  60. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/README.md +0 -0
  61. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/UncountablePythonSDK.egg-info/dependency_links.txt +0 -0
  62. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/UncountablePythonSDK.egg-info/top_level.txt +0 -0
  63. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/docs/.gitignore +0 -0
  64. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/docs/conf.py +0 -0
  65. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/docs/index.md +0 -0
  66. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/docs/integration_examples/create_ingredient.md +0 -0
  67. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/docs/integration_examples/create_output.md +0 -0
  68. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/docs/integration_examples/index.md +0 -0
  69. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/docs/integration_examples/upload_file.md +0 -0
  70. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/docs/justfile +0 -0
  71. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/docs/static/favicons/android-chrome-192x192.png +0 -0
  72. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/docs/static/favicons/android-chrome-512x512.png +0 -0
  73. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/docs/static/favicons/apple-touch-icon.png +0 -0
  74. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/docs/static/favicons/browserconfig.xml +0 -0
  75. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/docs/static/favicons/favicon-16x16.png +0 -0
  76. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/docs/static/favicons/favicon-32x32.png +0 -0
  77. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/docs/static/favicons/manifest.json +0 -0
  78. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/docs/static/favicons/mstile-150x150.png +0 -0
  79. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/docs/static/favicons/safari-pinned-tab.svg +0 -0
  80. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/docs/static/logo_blue.png +0 -0
  81. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/examples/async_batch.py +0 -0
  82. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/examples/basic_auth.py +0 -0
  83. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/examples/create_entity.py +0 -0
  84. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/examples/create_ingredient_sdk.py +0 -0
  85. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/examples/download_files.py +0 -0
  86. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/examples/edit_recipe_inputs.py +0 -0
  87. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/examples/integration-server/jobs/materials_auto/concurrent_cron.py +0 -0
  88. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/examples/integration-server/jobs/materials_auto/example_cron.py +0 -0
  89. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/examples/integration-server/jobs/materials_auto/example_http.py +0 -0
  90. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/examples/integration-server/jobs/materials_auto/example_instrument.py +0 -0
  91. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/examples/integration-server/jobs/materials_auto/example_predictions.py +0 -0
  92. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/examples/integration-server/jobs/materials_auto/example_runsheet_wh.py +0 -0
  93. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/examples/integration-server/jobs/materials_auto/example_wh.py +0 -0
  94. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/examples/integration-server/jobs/materials_auto/profile.yaml +0 -0
  95. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/examples/invoke_uploader.py +0 -0
  96. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/examples/oauth.py +0 -0
  97. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/examples/set_recipe_metadata_file.py +0 -0
  98. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/examples/set_recipe_output_file_sdk.py +0 -0
  99. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/examples/upload_files.py +0 -0
  100. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/pkgs/__init__.py +0 -0
  101. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/pkgs/argument_parser/_is_enum.py +0 -0
  102. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/pkgs/argument_parser/_is_namedtuple.py +0 -0
  103. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/pkgs/argument_parser/case_convert.py +0 -0
  104. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/pkgs/filesystem_utils/file_type_utils.py +0 -0
  105. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/pkgs/filesystem_utils/filesystem_session.py +0 -0
  106. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/pkgs/py.typed +0 -0
  107. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/pkgs/serialization/annotation.py +0 -0
  108. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/pkgs/serialization/serial_alias.py +0 -0
  109. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/pkgs/serialization/serial_class.py +0 -0
  110. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/pkgs/serialization/serial_generic.py +0 -0
  111. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/pkgs/serialization/serial_union.py +0 -0
  112. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/pkgs/serialization/yaml.py +0 -0
  113. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/pkgs/serialization_util/__init__.py +0 -0
  114. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/pkgs/serialization_util/_get_type_for_serialization.py +0 -0
  115. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/pkgs/serialization_util/convert_to_snakecase.py +0 -0
  116. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/pkgs/serialization_util/dataclasses.py +0 -0
  117. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/pkgs/serialization_util/serialization_helpers.py +0 -0
  118. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/pkgs/strenum_compat/__init__.py +0 -0
  119. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/pkgs/strenum_compat/strenum_compat.py +0 -0
  120. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/pkgs/type_spec/__init__.py +0 -0
  121. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/pkgs/type_spec/__main__.py +0 -0
  122. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/pkgs/type_spec/actions_registry/__init__.py +0 -0
  123. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/pkgs/type_spec/actions_registry/__main__.py +0 -0
  124. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/pkgs/type_spec/actions_registry/emit_typescript.py +0 -0
  125. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/pkgs/type_spec/builder_types.py +0 -0
  126. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/pkgs/type_spec/config.py +0 -0
  127. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/pkgs/type_spec/cross_output_links.py +0 -0
  128. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/pkgs/type_spec/emit_open_api.py +0 -0
  129. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/pkgs/type_spec/emit_open_api_util.py +0 -0
  130. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/pkgs/type_spec/emit_typescript.py +0 -0
  131. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/pkgs/type_spec/load_types.py +0 -0
  132. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/pkgs/type_spec/non_discriminated_union_exceptions.py +0 -0
  133. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/pkgs/type_spec/open_api_util.py +0 -0
  134. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/pkgs/type_spec/test.py +0 -0
  135. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/pkgs/type_spec/type_info/__main__.py +0 -0
  136. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/pkgs/type_spec/ui_entry_actions/__init__.py +0 -0
  137. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/pkgs/type_spec/ui_entry_actions/generate_ui_entry_actions.py +0 -0
  138. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/pkgs/type_spec/util.py +0 -0
  139. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/pkgs/type_spec/value_spec/__init__.py +0 -0
  140. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/pkgs/type_spec/value_spec/__main__.py +0 -0
  141. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/pkgs/type_spec/value_spec/convert_type.py +0 -0
  142. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/pkgs/type_spec/value_spec/types.py +0 -0
  143. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/setup.cfg +0 -0
  144. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/__init__.py +0 -0
  145. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/core/__init__.py +0 -0
  146. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/core/async_batch.py +0 -0
  147. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/core/client.py +0 -0
  148. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/core/environment.py +0 -0
  149. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/core/file_upload.py +0 -0
  150. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/core/types.py +0 -0
  151. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/integration/__init__.py +0 -0
  152. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/integration/construct_client.py +0 -0
  153. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/integration/cron.py +0 -0
  154. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/integration/db/__init__.py +0 -0
  155. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/integration/db/connect.py +0 -0
  156. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/integration/db/session.py +0 -0
  157. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/integration/entrypoint.py +0 -0
  158. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/integration/executors/__init__.py +0 -0
  159. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/integration/executors/executors.py +0 -0
  160. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/integration/executors/generic_upload_executor.py +0 -0
  161. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/integration/executors/script_executor.py +0 -0
  162. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/integration/http_server/__init__.py +0 -0
  163. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/integration/http_server/types.py +0 -0
  164. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/integration/job.py +0 -0
  165. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/integration/queue_runner/__init__.py +0 -0
  166. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/integration/queue_runner/command_server/__init__.py +0 -0
  167. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/integration/queue_runner/command_server/constants.py +0 -0
  168. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/integration/queue_runner/command_server/protocol/__init__.py +0 -0
  169. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/integration/queue_runner/command_server/types.py +0 -0
  170. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/integration/queue_runner/datastore/__init__.py +0 -0
  171. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/integration/queue_runner/datastore/model.py +0 -0
  172. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/integration/queue_runner/job_scheduler.py +0 -0
  173. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/integration/queue_runner/queue_runner.py +0 -0
  174. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/integration/queue_runner/types.py +0 -0
  175. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/integration/queue_runner/worker.py +0 -0
  176. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/integration/scan_profiles.py +0 -0
  177. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/integration/scheduler.py +0 -0
  178. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/integration/secret_retrieval/__init__.py +0 -0
  179. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/integration/secret_retrieval/retrieve_secret.py +0 -0
  180. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/integration/webhook_server/entrypoint.py +0 -0
  181. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/py.typed +0 -0
  182. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/api/__init__.py +0 -0
  183. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/api/batch/__init__.py +0 -0
  184. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/api/batch/execute_batch.py +0 -0
  185. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/api/batch/execute_batch_load_async.py +0 -0
  186. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/api/chemical/__init__.py +0 -0
  187. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/api/chemical/convert_chemical_formats.py +0 -0
  188. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/api/condition_parameters/__init__.py +0 -0
  189. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/api/condition_parameters/upsert_condition_match.py +0 -0
  190. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/api/entity/__init__.py +0 -0
  191. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/api/entity/create_entities.py +0 -0
  192. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/api/entity/create_entity.py +0 -0
  193. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/api/entity/create_or_update_entity.py +0 -0
  194. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/api/entity/export_entities.py +0 -0
  195. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/api/entity/get_entities_data.py +0 -0
  196. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/api/entity/grant_entity_permissions.py +0 -0
  197. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/api/entity/list_aggregate.py +0 -0
  198. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/api/entity/list_entities.py +0 -0
  199. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/api/entity/lock_entity.py +0 -0
  200. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/api/entity/lookup_entity.py +0 -0
  201. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/api/entity/resolve_entity_ids.py +0 -0
  202. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/api/entity/set_barcode.py +0 -0
  203. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/api/entity/set_entity_field_values.py +0 -0
  204. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/api/entity/set_values.py +0 -0
  205. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/api/entity/transition_entity_phase.py +0 -0
  206. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/api/entity/unlock_entity.py +0 -0
  207. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/api/equipment/__init__.py +0 -0
  208. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/api/equipment/associate_equipment_input.py +0 -0
  209. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/api/field_options/__init__.py +0 -0
  210. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/api/field_options/upsert_field_options.py +0 -0
  211. {uncountablepythonsdk-0.0.149/uncountable/types/api/files → uncountablepythonsdk-0.0.151/uncountable/types/api/file_folders}/__init__.py +0 -0
  212. {uncountablepythonsdk-0.0.149/uncountable/types/api/id_source → uncountablepythonsdk-0.0.151/uncountable/types/api/files}/__init__.py +0 -0
  213. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/api/files/create_file_record.py +0 -0
  214. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/api/files/download_file.py +0 -0
  215. {uncountablepythonsdk-0.0.149/uncountable/types/api/input_groups → uncountablepythonsdk-0.0.151/uncountable/types/api/id_source}/__init__.py +0 -0
  216. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/api/id_source/list_id_source.py +0 -0
  217. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/api/id_source/match_id_source.py +0 -0
  218. {uncountablepythonsdk-0.0.149/uncountable/types/api/inputs → uncountablepythonsdk-0.0.151/uncountable/types/api/input_groups}/__init__.py +0 -0
  219. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/api/input_groups/get_input_group_names.py +0 -0
  220. {uncountablepythonsdk-0.0.149/uncountable/types/api/integrations → uncountablepythonsdk-0.0.151/uncountable/types/api/inputs}/__init__.py +0 -0
  221. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/api/inputs/create_inputs.py +0 -0
  222. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/api/inputs/get_input_data.py +0 -0
  223. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/api/inputs/get_input_names.py +0 -0
  224. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/api/inputs/get_inputs_data.py +0 -0
  225. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/api/inputs/set_input_attribute_values.py +0 -0
  226. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/api/inputs/set_input_category.py +0 -0
  227. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/api/inputs/set_input_subcategories.py +0 -0
  228. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/api/inputs/set_intermediate_type.py +0 -0
  229. {uncountablepythonsdk-0.0.149/uncountable/types/api/listing → uncountablepythonsdk-0.0.151/uncountable/types/api/integrations}/__init__.py +0 -0
  230. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/api/integrations/publish_realtime_data.py +0 -0
  231. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/api/integrations/push_notification.py +0 -0
  232. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/api/integrations/register_sockets_token.py +0 -0
  233. {uncountablepythonsdk-0.0.149/uncountable/types/api/material_families → uncountablepythonsdk-0.0.151/uncountable/types/api/listing}/__init__.py +0 -0
  234. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/api/listing/fetch_listing.py +0 -0
  235. {uncountablepythonsdk-0.0.149/uncountable/types/api/notebooks → uncountablepythonsdk-0.0.151/uncountable/types/api/material_families}/__init__.py +0 -0
  236. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/api/material_families/update_entity_material_families.py +0 -0
  237. {uncountablepythonsdk-0.0.149/uncountable/types/api/outputs → uncountablepythonsdk-0.0.151/uncountable/types/api/notebooks}/__init__.py +0 -0
  238. {uncountablepythonsdk-0.0.149/uncountable/types/api/permissions → uncountablepythonsdk-0.0.151/uncountable/types/api/outputs}/__init__.py +0 -0
  239. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/api/outputs/get_output_data.py +0 -0
  240. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/api/outputs/get_output_names.py +0 -0
  241. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/api/outputs/get_output_organization.py +0 -0
  242. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/api/outputs/resolve_output_conditions.py +0 -0
  243. {uncountablepythonsdk-0.0.149/uncountable/types/api/project → uncountablepythonsdk-0.0.151/uncountable/types/api/permissions}/__init__.py +0 -0
  244. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/api/permissions/set_core_permissions.py +0 -0
  245. {uncountablepythonsdk-0.0.149/uncountable/types/api/recipe_links → uncountablepythonsdk-0.0.151/uncountable/types/api/project}/__init__.py +0 -0
  246. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/api/project/get_projects.py +0 -0
  247. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/api/project/get_projects_data.py +0 -0
  248. {uncountablepythonsdk-0.0.149/uncountable/types/api/recipe_metadata → uncountablepythonsdk-0.0.151/uncountable/types/api/recipe_links}/__init__.py +0 -0
  249. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/api/recipe_links/create_recipe_link.py +0 -0
  250. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/api/recipe_links/remove_recipe_link.py +0 -0
  251. {uncountablepythonsdk-0.0.149/uncountable/types/api/recipes → uncountablepythonsdk-0.0.151/uncountable/types/api/recipe_metadata}/__init__.py +0 -0
  252. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/api/recipe_metadata/get_recipe_metadata_data.py +0 -0
  253. {uncountablepythonsdk-0.0.149/uncountable/types/api/runsheet → uncountablepythonsdk-0.0.151/uncountable/types/api/recipes}/__init__.py +0 -0
  254. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/api/recipes/add_recipe_to_project.py +0 -0
  255. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/api/recipes/add_time_series_data.py +0 -0
  256. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/api/recipes/archive_recipes.py +0 -0
  257. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/api/recipes/associate_recipe_as_input.py +0 -0
  258. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/api/recipes/associate_recipe_as_lot.py +0 -0
  259. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/api/recipes/clear_recipe_outputs.py +0 -0
  260. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/api/recipes/create_mix_order.py +0 -0
  261. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/api/recipes/create_recipe.py +0 -0
  262. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/api/recipes/create_recipes.py +0 -0
  263. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/api/recipes/disassociate_recipe_as_input.py +0 -0
  264. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/api/recipes/edit_recipe_inputs.py +0 -0
  265. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/api/recipes/get_column_calculation_values.py +0 -0
  266. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/api/recipes/get_curve.py +0 -0
  267. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/api/recipes/get_recipe_calculations.py +0 -0
  268. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/api/recipes/get_recipe_links.py +0 -0
  269. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/api/recipes/get_recipe_names.py +0 -0
  270. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/api/recipes/get_recipe_output_metadata.py +0 -0
  271. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/api/recipes/get_recipes_data.py +0 -0
  272. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/api/recipes/lock_recipes.py +0 -0
  273. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/api/recipes/remove_recipe_from_project.py +0 -0
  274. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/api/recipes/set_recipe_inputs.py +0 -0
  275. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/api/recipes/set_recipe_metadata.py +0 -0
  276. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/api/recipes/set_recipe_output_annotations.py +0 -0
  277. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/api/recipes/set_recipe_output_file.py +0 -0
  278. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/api/recipes/set_recipe_outputs.py +0 -0
  279. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/api/recipes/set_recipe_tags.py +0 -0
  280. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/api/recipes/set_recipe_total.py +0 -0
  281. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/api/recipes/unarchive_recipes.py +0 -0
  282. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/api/recipes/unlock_recipes.py +0 -0
  283. {uncountablepythonsdk-0.0.149/uncountable/types/api/triggers → uncountablepythonsdk-0.0.151/uncountable/types/api/runsheet}/__init__.py +0 -0
  284. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/api/runsheet/complete_async_upload.py +0 -0
  285. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/api/runsheet/export_default_runsheet.py +0 -0
  286. {uncountablepythonsdk-0.0.149/uncountable/types/api/uploader → uncountablepythonsdk-0.0.151/uncountable/types/api/triggers}/__init__.py +0 -0
  287. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/api/triggers/run_trigger.py +0 -0
  288. {uncountablepythonsdk-0.0.149/uncountable/types/api/user → uncountablepythonsdk-0.0.151/uncountable/types/api/uploader}/__init__.py +0 -0
  289. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/api/uploader/complete_async_parse.py +0 -0
  290. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/api/uploader/invoke_uploader.py +0 -0
  291. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/api/user/get_current_user_info.py +0 -0
  292. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/async_batch.py +0 -0
  293. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/async_jobs.py +0 -0
  294. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/async_jobs_t.py +0 -0
  295. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/auth_retrieval.py +0 -0
  296. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/auth_retrieval_t.py +0 -0
  297. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/calculations.py +0 -0
  298. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/calculations_t.py +0 -0
  299. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/chemical_structure.py +0 -0
  300. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/chemical_structure_t.py +0 -0
  301. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/client_config.py +0 -0
  302. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/client_config_t.py +0 -0
  303. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/curves.py +0 -0
  304. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/curves_t.py +0 -0
  305. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/data.py +0 -0
  306. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/data_t.py +0 -0
  307. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/entity.py +0 -0
  308. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/experiment_groups.py +0 -0
  309. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/experiment_groups_t.py +0 -0
  310. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/exports.py +0 -0
  311. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/exports_t.py +0 -0
  312. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/field_values.py +0 -0
  313. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/field_values_t.py +0 -0
  314. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/fields.py +0 -0
  315. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/fields_t.py +0 -0
  316. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/generic_upload.py +0 -0
  317. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/generic_upload_t.py +0 -0
  318. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/id_source.py +0 -0
  319. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/id_source_t.py +0 -0
  320. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/identifier.py +0 -0
  321. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/identifier_t.py +0 -0
  322. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/input_attributes.py +0 -0
  323. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/input_attributes_t.py +0 -0
  324. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/inputs.py +0 -0
  325. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/integration_server.py +0 -0
  326. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/integration_server_t.py +0 -0
  327. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/integration_session.py +0 -0
  328. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/integration_session_t.py +0 -0
  329. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/integrations.py +0 -0
  330. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/integrations_t.py +0 -0
  331. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/job_definition.py +0 -0
  332. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/job_definition_t.py +0 -0
  333. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/listing.py +0 -0
  334. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/listing_t.py +0 -0
  335. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/notices.py +0 -0
  336. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/notices_t.py +0 -0
  337. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/notifications.py +0 -0
  338. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/notifications_t.py +0 -0
  339. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/outputs.py +0 -0
  340. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/outputs_t.py +0 -0
  341. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/overrides.py +0 -0
  342. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/overrides_t.py +0 -0
  343. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/permissions.py +0 -0
  344. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/permissions_t.py +0 -0
  345. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/phases.py +0 -0
  346. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/phases_t.py +0 -0
  347. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/post_base.py +0 -0
  348. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/post_base_t.py +0 -0
  349. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/queued_job.py +0 -0
  350. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/queued_job_t.py +0 -0
  351. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/recipe_identifiers.py +0 -0
  352. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/recipe_identifiers_t.py +0 -0
  353. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/recipe_inputs.py +0 -0
  354. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/recipe_inputs_t.py +0 -0
  355. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/recipe_links.py +0 -0
  356. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/recipe_links_t.py +0 -0
  357. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/recipe_metadata.py +0 -0
  358. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/recipe_metadata_t.py +0 -0
  359. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/recipe_output_metadata.py +0 -0
  360. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/recipe_output_metadata_t.py +0 -0
  361. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/recipe_tags.py +0 -0
  362. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/recipe_tags_t.py +0 -0
  363. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/recipe_workflow_steps.py +0 -0
  364. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/recipe_workflow_steps_t.py +0 -0
  365. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/recipes.py +0 -0
  366. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/recipes_t.py +0 -0
  367. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/response.py +0 -0
  368. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/response_t.py +0 -0
  369. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/runsheet.py +0 -0
  370. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/runsheet_format.py +0 -0
  371. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/runsheet_format_t.py +0 -0
  372. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/runsheet_t.py +0 -0
  373. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/secret_retrieval.py +0 -0
  374. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/secret_retrieval_t.py +0 -0
  375. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/sockets.py +0 -0
  376. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/sockets_t.py +0 -0
  377. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/specs.py +0 -0
  378. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/specs_t.py +0 -0
  379. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/units.py +0 -0
  380. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/units_t.py +0 -0
  381. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/uploader.py +0 -0
  382. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/uploader_t.py +0 -0
  383. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/users.py +0 -0
  384. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/users_t.py +0 -0
  385. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/webhook_job.py +0 -0
  386. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/webhook_job_t.py +0 -0
  387. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/workflows.py +0 -0
  388. {uncountablepythonsdk-0.0.149 → uncountablepythonsdk-0.0.151}/uncountable/types/workflows_t.py +0 -0
@@ -17,7 +17,7 @@ jobs:
17
17
  - name: Set up UV
18
18
  uses: astral-sh/setup-uv@f0ec1fc3b38f5e7cd731bb6ce540c5af426746bb
19
19
  with:
20
- version: "0.9.5"
20
+ version: "0.9.25"
21
21
  activate-environment: true
22
22
  enable-cache: true
23
23
  - name: Install dependencies
@@ -26,7 +26,7 @@ jobs:
26
26
  - name: Set up UV
27
27
  uses: astral-sh/setup-uv@f0ec1fc3b38f5e7cd731bb6ce540c5af426746bb
28
28
  with:
29
- version: "0.9.5"
29
+ version: "0.9.25"
30
30
  activate-environment: true
31
31
  enable-cache: true
32
32
  - name: Install build dependencies
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: UncountablePythonSDK
3
- Version: 0.0.149
3
+ Version: 0.0.151
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
@@ -35,13 +35,13 @@ Requires-Dist: paramiko==3.*
35
35
  Requires-Dist: boto3==1.*
36
36
  Requires-Dist: flask==3.*
37
37
  Requires-Dist: simplejson==3.*
38
- Requires-Dist: grpcio==1.67.1
38
+ Requires-Dist: grpcio==1.78.0
39
39
  Requires-Dist: protobuf>=4.21.1
40
40
  Requires-Dist: azure-storage-blob==12.*
41
41
  Requires-Dist: boto3-stubs[essential,ses]==1.*
42
42
  Requires-Dist: msgspec<0.21,>=0.19
43
43
  Requires-Dist: tabulate==0.9.0
44
- Requires-Dist: types-psutil~=7.1.3
44
+ Requires-Dist: types-psutil~=7.2.1
45
45
  Requires-Dist: psutil>=5.9.0
46
46
  Provides-Extra: test
47
47
  Requires-Dist: mypy==1.*; extra == "test"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: UncountablePythonSDK
3
- Version: 0.0.149
3
+ Version: 0.0.151
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
@@ -35,13 +35,13 @@ Requires-Dist: paramiko==3.*
35
35
  Requires-Dist: boto3==1.*
36
36
  Requires-Dist: flask==3.*
37
37
  Requires-Dist: simplejson==3.*
38
- Requires-Dist: grpcio==1.67.1
38
+ Requires-Dist: grpcio==1.78.0
39
39
  Requires-Dist: protobuf>=4.21.1
40
40
  Requires-Dist: azure-storage-blob==12.*
41
41
  Requires-Dist: boto3-stubs[essential,ses]==1.*
42
42
  Requires-Dist: msgspec<0.21,>=0.19
43
43
  Requires-Dist: tabulate==0.9.0
44
- Requires-Dist: types-psutil~=7.1.3
44
+ Requires-Dist: types-psutil~=7.2.1
45
45
  Requires-Dist: psutil>=5.9.0
46
46
  Provides-Extra: test
47
47
  Requires-Dist: mypy==1.*; extra == "test"
@@ -36,6 +36,7 @@ examples/download_files.py
36
36
  examples/edit_recipe_inputs.py
37
37
  examples/invoke_uploader.py
38
38
  examples/oauth.py
39
+ examples/set_input_pdf_attribute.py
39
40
  examples/set_recipe_metadata_file.py
40
41
  examples/set_recipe_output_file_sdk.py
41
42
  examples/upload_files.py
@@ -72,6 +73,7 @@ pkgs/serialization/serial_alias.py
72
73
  pkgs/serialization/serial_class.py
73
74
  pkgs/serialization/serial_generic.py
74
75
  pkgs/serialization/serial_union.py
76
+ pkgs/serialization/unknown.py
75
77
  pkgs/serialization/yaml.py
76
78
  pkgs/serialization_util/__init__.py
77
79
  pkgs/serialization_util/_get_type_for_serialization.py
@@ -294,6 +296,8 @@ uncountable/types/api/equipment/__init__.py
294
296
  uncountable/types/api/equipment/associate_equipment_input.py
295
297
  uncountable/types/api/field_options/__init__.py
296
298
  uncountable/types/api/field_options/upsert_field_options.py
299
+ uncountable/types/api/file_folders/__init__.py
300
+ uncountable/types/api/file_folders/modify_file_system.py
297
301
  uncountable/types/api/files/__init__.py
298
302
  uncountable/types/api/files/create_file_record.py
299
303
  uncountable/types/api/files/download_file.py
@@ -326,8 +330,10 @@ uncountable/types/api/outputs/get_output_data.py
326
330
  uncountable/types/api/outputs/get_output_names.py
327
331
  uncountable/types/api/outputs/get_output_organization.py
328
332
  uncountable/types/api/outputs/resolve_output_conditions.py
333
+ uncountable/types/api/outputs/update_output_condition_parameter.py
329
334
  uncountable/types/api/permissions/__init__.py
330
335
  uncountable/types/api/permissions/set_core_permissions.py
336
+ uncountable/types/api/permissions/set_entity_permission.py
331
337
  uncountable/types/api/project/__init__.py
332
338
  uncountable/types/api/project/get_projects.py
333
339
  uncountable/types/api/project/get_projects_data.py
@@ -17,13 +17,13 @@ paramiko==3.*
17
17
  boto3==1.*
18
18
  flask==3.*
19
19
  simplejson==3.*
20
- grpcio==1.67.1
20
+ grpcio==1.78.0
21
21
  protobuf>=4.21.1
22
22
  azure-storage-blob==12.*
23
23
  boto3-stubs[essential,ses]==1.*
24
24
  msgspec<0.21,>=0.19
25
25
  tabulate==0.9.0
26
- types-psutil~=7.1.3
26
+ types-psutil~=7.2.1
27
27
  psutil>=5.9.0
28
28
 
29
29
  [test]
@@ -0,0 +1,9 @@
1
+ furo==2025.12.19
2
+ myst-parser==5.0.0
3
+ sphinx-autoapi==3.6.1
4
+ sphinx-copybutton==0.5.2
5
+ Sphinx==8.2.3
6
+ sphinx_design==0.7.0
7
+ sphinx-favicon==1.0.1
8
+ astroid==4.0.3
9
+ docutils==0.21.2
@@ -110,7 +110,63 @@ class ParseExample(WebhookJob[ParsePayload]):
110
110
  ),
111
111
  ),
112
112
  ],
113
- )
113
+ ),
114
+ uploader_t.ParsedFileData(
115
+ file_name=file_name,
116
+ file_structures=[
117
+ uploader_t.DataChannel(
118
+ type=uploader_t.StructureElementType.CHANNEL,
119
+ channel=uploader_t.TextChannelData(
120
+ name="column1",
121
+ type=uploader_t.ChannelType.TEXT_CHANNEL,
122
+ data=[
123
+ uploader_t.StringValue(value="value1"),
124
+ uploader_t.StringValue(value="value4"),
125
+ uploader_t.StringValue(value="value7"),
126
+ ],
127
+ ),
128
+ ),
129
+ uploader_t.DataChannel(
130
+ type=uploader_t.StructureElementType.CHANNEL,
131
+ channel=uploader_t.TextChannelData(
132
+ name="column2",
133
+ type=uploader_t.ChannelType.TEXT_CHANNEL,
134
+ data=[
135
+ uploader_t.StringValue(value="value2"),
136
+ uploader_t.StringValue(value="value5"),
137
+ uploader_t.StringValue(value="value8"),
138
+ ],
139
+ ),
140
+ ),
141
+ uploader_t.DataChannel(
142
+ type=uploader_t.StructureElementType.CHANNEL,
143
+ channel=uploader_t.TextChannelData(
144
+ name="column3",
145
+ type=uploader_t.ChannelType.TEXT_CHANNEL,
146
+ data=[
147
+ uploader_t.StringValue(value="value3"),
148
+ uploader_t.StringValue(value="value6"),
149
+ uploader_t.StringValue(value="value9"),
150
+ ],
151
+ ),
152
+ ),
153
+ uploader_t.HeaderEntry(
154
+ type=uploader_t.StructureElementType.HEADER,
155
+ value=uploader_t.NumericHeaderData(
156
+ name="file structure number",
157
+ data=uploader_t.DecimalValue(value=Decimal(99)),
158
+ ),
159
+ ),
160
+ uploader_t.HeaderEntry(
161
+ type=uploader_t.StructureElementType.HEADER,
162
+ value=uploader_t.TextHeaderData(
163
+ name="uploaded file name",
164
+ type=uploader_t.HeaderType.TEXT_HEADER,
165
+ data=uploader_t.StringValue(value=file_name),
166
+ ),
167
+ ),
168
+ ],
169
+ ),
114
170
  ]
115
171
 
116
172
  complete_async_parse_req = args.batch_processor.complete_async_parse(
@@ -17,7 +17,7 @@ dependencies = [
17
17
  "types-simplejson == 3.*",
18
18
  "pandas-stubs",
19
19
  "xlrd == 2.*",
20
- "msgspec == 0.19.*",
20
+ "msgspec ==0.20.*",
21
21
  "websockets==15.0.1",
22
22
  ]
23
23
 
@@ -0,0 +1,67 @@
1
+ """
2
+ Example: Upload a PDF file and set it as an input (ingredient) attribute value.
3
+
4
+ This example demonstrates the end-to-end flow for setting a PDF attribute on an input:
5
+ 1. Upload a PDF file using the upload_files API
6
+ 2. Call set_input_attribute_values with the file_id to associate the PDF with an input attribute
7
+
8
+ Prerequisites:
9
+ - You need an input (ingredient) ID and an attribute ID that is of type PDF
10
+ - You can find these by:
11
+ - Going to the Inputs page in the platform
12
+ - Selecting an input to get its ID from the URL
13
+ - Looking at the attribute configuration to find a PDF-type attribute ID
14
+
15
+ Usage:
16
+ export UNC_API_ID="your_api_id"
17
+ export UNC_API_SECRET_KEY="your_api_secret_key"
18
+ python set_input_pdf_attribute.py
19
+ """
20
+
21
+ import os
22
+ from pathlib import Path
23
+
24
+ import uncountable.types.api.inputs.set_input_attribute_values as set_input_attribute_values_t
25
+ from uncountable.core import AuthDetailsApiKey, Client, MediaFileUpload
26
+
27
+ # Initialize the client
28
+ client = Client(
29
+ base_url="http://localhost:5000",
30
+ auth_details=AuthDetailsApiKey(
31
+ api_id=os.environ["UNC_API_ID"],
32
+ api_secret_key=os.environ["UNC_API_SECRET_KEY"],
33
+ ),
34
+ )
35
+
36
+ # Configuration - update these values for your specific use case
37
+ PDF_FILE_PATH = str(
38
+ (Path.home() / "Downloads" / "All Projects - January 15, 2026.pdf").absolute()
39
+ )
40
+ INPUT_ID = 1 # Replace with your actual input (ingredient) ID
41
+ PDF_ATTRIBUTE_ID = 136 # Replace with your actual PDF attribute ID
42
+
43
+ # Step 1: Upload the PDF file
44
+ print(f"Uploading PDF file: {PDF_FILE_PATH}")
45
+ uploaded_files = client.upload_files(
46
+ file_uploads=[
47
+ MediaFileUpload(path=PDF_FILE_PATH),
48
+ ]
49
+ )
50
+ uploaded_file = uploaded_files[0]
51
+ print(f"File uploaded successfully. File ID: {uploaded_file.file_id}")
52
+
53
+ # Step 2: Set the PDF attribute on the input
54
+ print(f"Setting PDF attribute {PDF_ATTRIBUTE_ID} on input {INPUT_ID}...")
55
+ client.set_input_attribute_values(
56
+ attribute_values=[
57
+ set_input_attribute_values_t.InputAttributeValue(
58
+ input_id=INPUT_ID,
59
+ attribute_id=PDF_ATTRIBUTE_ID,
60
+ file_ids=[uploaded_file.file_id],
61
+ ),
62
+ ],
63
+ )
64
+ print("PDF attribute set successfully!")
65
+
66
+ # After running this script, you should be able to view/download the PDF
67
+ # in the platform by navigating to the input's attribute values.
@@ -5,6 +5,7 @@ from .argument_parser import ParserError as ParserError
5
5
  from .argument_parser import ParserExtraFieldsError as ParserExtraFieldsError
6
6
  from .argument_parser import ParserFunction as ParserFunction
7
7
  from .argument_parser import ParserOptions as ParserOptions
8
+ from .argument_parser import ParserTypeError as ParserTypeError
8
9
  from .argument_parser import SourceEncoding as SourceEncoding
9
10
  from .argument_parser import build_parser as build_parser
10
11
  from .argument_parser import is_missing as is_missing
@@ -18,6 +18,7 @@ import msgspec.yaml
18
18
  from pkgs.serialization import (
19
19
  MissingSentryType,
20
20
  OpaqueKey,
21
+ UnknownBrand,
21
22
  get_serial_class_data,
22
23
  get_serial_union_data,
23
24
  )
@@ -84,6 +85,9 @@ class ParserExtraFieldsError(ParserError):
84
85
  return f"extra fields were provided: {', '.join(self.extra_fields)}"
85
86
 
86
87
 
88
+ class ParserTypeError(ParserError): ...
89
+
90
+
87
91
  def is_union(field_type: typing.Any) -> bool:
88
92
  origin = typing.get_origin(field_type)
89
93
  return origin is typing.Union or origin is types.UnionType
@@ -500,6 +504,11 @@ def _build_parser_inner(
500
504
 
501
505
  return error
502
506
 
507
+ if typing.get_origin(parsed_type) is typing.Annotated and typing.get_args(
508
+ parsed_type
509
+ ) == (object, UnknownBrand):
510
+ raise ParserTypeError("Cannot build parser for unknown type")
511
+
503
512
  # Check last for generic annotated types and process them unwrapped
504
513
  # this must be last, since some of the expected types, like Unions,
505
514
  # will also be annotated, but have a special form
@@ -1,3 +1,4 @@
1
+ from ._blob_session import BlobSession as BlobSession
1
2
  from ._gdrive_session import GDriveSession as GDriveSession
2
3
  from ._gdrive_session import delete_gdrive_file as delete_gdrive_file
3
4
  from ._gdrive_session import download_gdrive_file as download_gdrive_file
@@ -10,6 +11,7 @@ from ._sftp_session import SFTPSession as SFTPSession
10
11
  from ._sftp_session import list_sftp_files as list_sftp_files
11
12
  from ._sftp_session import move_sftp_files as move_sftp_files
12
13
  from .file_type_utils import FileObjectData as FileObjectData
14
+ from .file_type_utils import FileSystemBlobConfig as FileSystemBlobConfig
13
15
  from .file_type_utils import FileSystemFileReference as FileSystemFileReference
14
16
  from .file_type_utils import FileSystemObject as FileSystemObject
15
17
  from .file_type_utils import FileSystemS3Config as FileSystemS3Config
@@ -1,4 +1,5 @@
1
1
  from io import BytesIO
2
+ from typing import Self
2
3
 
3
4
  from azure.core.credentials import AzureSasCredential
4
5
  from azure.storage.blob import BlobServiceClient, ContainerClient
@@ -36,7 +37,7 @@ class BlobSession(FileSystemSession):
36
37
  self.service_client.get_container_client(self.config.container)
37
38
  )
38
39
 
39
- def __enter__(self) -> "BlobSession":
40
+ def __enter__(self) -> Self:
40
41
  self.start()
41
42
  return self
42
43
 
@@ -1,6 +1,6 @@
1
1
  import os
2
2
  from io import BytesIO
3
- from typing import Any
3
+ from typing import Any, Self
4
4
 
5
5
  from google.oauth2 import service_account
6
6
  from googleapiclient.discovery import build as build_gdrive_connection
@@ -304,7 +304,7 @@ class GDriveSession(FileSystemSession):
304
304
  downloaded_files.append(downloaded_file)
305
305
  return downloaded_files
306
306
 
307
- def __enter__(self) -> "GDriveSession":
307
+ def __enter__(self) -> Self:
308
308
  self.start()
309
309
  return self
310
310
 
@@ -1,5 +1,6 @@
1
1
  import os
2
2
  from io import BytesIO
3
+ from typing import Self
3
4
 
4
5
  from pkgs.filesystem_utils.file_type_utils import (
5
6
  FileObjectData,
@@ -19,7 +20,7 @@ class LocalSession(FileSystemSession):
19
20
  def start(self) -> None:
20
21
  return None
21
22
 
22
- def __enter__(self) -> "LocalSession":
23
+ def __enter__(self) -> Self:
23
24
  return self
24
25
 
25
26
  def __exit__(self, exc_type: object, exc_val: object, exc_tb: object) -> None:
@@ -1,4 +1,5 @@
1
1
  from io import BytesIO
2
+ from typing import Self
2
3
 
3
4
  from boto3.session import Session
4
5
  from mypy_boto3_s3.service_resource import Bucket
@@ -40,7 +41,7 @@ class S3Session(FileSystemSession):
40
41
 
41
42
  self.bucket: Bucket | None = s3_resource.Bucket(self.config.bucket_name)
42
43
 
43
- def __enter__(self) -> "S3Session":
44
+ def __enter__(self) -> Self:
44
45
  self.start()
45
46
  return self
46
47
 
@@ -54,21 +55,34 @@ class S3Session(FileSystemSession):
54
55
  recursive: bool = False,
55
56
  valid_extensions: list[str] | None = None,
56
57
  ) -> list[FileSystemObject]:
58
+ """List S3 objects under the given directory, optionally recursively and filtered by file extension."""
57
59
  if not isinstance(dir_path, FileSystemFileReference):
58
60
  raise IncompatibleFileReference()
59
61
 
60
62
  assert self.bucket is not None, "call to list_files on uninitialized s3 session"
61
63
 
64
+ prefix: str = dir_path.filepath
65
+ if prefix and not prefix.endswith("/"):
66
+ prefix += "/"
67
+
62
68
  filesystem_references: list[FileSystemObject] = []
63
- prefix = _add_slash(dir_path.filepath)
64
- for obj in self.bucket.objects.filter(Prefix=prefix):
65
- if not recursive and (obj.key == prefix or "/" in obj.key[len(prefix) :]):
69
+
70
+ if recursive:
71
+ object_keys = (obj.key for obj in self.bucket.objects.filter(Prefix=prefix))
72
+ else:
73
+ s3_client = self.bucket.meta.client
74
+ response = s3_client.list_objects_v2(
75
+ Bucket=self.bucket.name, Prefix=prefix, Delimiter="/"
76
+ )
77
+ object_keys = (obj_dict["Key"] for obj_dict in response.get("Contents", []))
78
+
79
+ for obj_key in object_keys:
80
+ if obj_key == prefix:
66
81
  continue
67
82
  if valid_extensions is None or any(
68
- obj.key.endswith(valid_extension)
69
- for valid_extension in valid_extensions
83
+ obj_key.endswith(ext) for ext in valid_extensions
70
84
  ):
71
- filesystem_references.append(FileSystemFileReference(obj.key))
85
+ filesystem_references.append(FileSystemFileReference(obj_key))
72
86
 
73
87
  return filesystem_references
74
88
 
@@ -1,6 +1,7 @@
1
1
  import os
2
2
  from collections.abc import Iterable
3
3
  from io import BytesIO
4
+ from typing import Self
4
5
 
5
6
  import paramiko
6
7
  import pysftp
@@ -96,7 +97,7 @@ class SFTPSession(FileSystemSession):
96
97
  "Must specify either a private key path or a password."
97
98
  )
98
99
 
99
- def __enter__(self) -> "SFTPSession":
100
+ def __enter__(self) -> Self:
100
101
  self.start()
101
102
  return self
102
103
 
@@ -15,3 +15,4 @@ from .serial_class import serial_string_enum as serial_string_enum
15
15
  from .serial_generic import get_serial_data as get_serial_data
16
16
  from .serial_union import get_serial_union_data as get_serial_union_data
17
17
  from .serial_union import serial_union_annotation as serial_union_annotation
18
+ from .unknown import UnknownBrand as UnknownBrand
@@ -11,7 +11,7 @@ class MissingSentryType:
11
11
 
12
12
  _instance: Optional["MissingSentryType"] = None
13
13
 
14
- def __new__(cls) -> "MissingSentryType":
14
+ def __new__(cls) -> "MissingSentryType": # noqa: PYI034
15
15
  if cls._instance is None:
16
16
  cls._instance = super().__new__(cls)
17
17
  return cls._instance
@@ -1,4 +1,7 @@
1
+ from typing import Self
2
+
3
+
1
4
  # Blocks a string key value from being interpreted for case conversion
2
5
  class OpaqueKey(str): # noqa: FURB189
3
- def __new__(cls, key: str) -> "OpaqueKey":
6
+ def __new__(cls, key: str) -> Self:
4
7
  return str.__new__(cls, key)
@@ -0,0 +1,4 @@
1
+ class UnknownBrand:
2
+ """
3
+ A branding to uniquely identify the Unknown type.
4
+ """
@@ -98,6 +98,7 @@ class BaseTypeName(StrEnum):
98
98
  s_dict = "Dict"
99
99
  s_integer = "Integer"
100
100
  s_json_value = "JsonValue"
101
+ s_unknown = "Unknown"
101
102
  s_list = "List"
102
103
  s_lossy_decimal = "LossyDecimal"
103
104
  # The explicit None type is useful in certain discriminating unions and aliases
@@ -1450,6 +1451,12 @@ class SpecBuilder:
1450
1451
  "JsonScalar",
1451
1452
  is_predefined=True,
1452
1453
  )
1454
+ base_namespace.types["Unknown"] = SpecTypeDefnObject(
1455
+ base_namespace,
1456
+ "Unknown",
1457
+ is_predefined=True,
1458
+ _is_value_converted=True,
1459
+ )
1453
1460
 
1454
1461
  def push_where(self, msg: str) -> None:
1455
1462
  self.where.append(msg)
@@ -20,6 +20,7 @@ base_name_map_io_ts = {
20
20
  builder.BaseTypeName.s_string: "IO.string",
21
21
  # UNC: global types
22
22
  builder.BaseTypeName.s_json_value: "IO.unknown",
23
+ builder.BaseTypeName.s_unknown: "IO.unknown",
23
24
  }
24
25
 
25
26
 
@@ -491,6 +491,7 @@ def _create_sdk_compat_namespace(namespace: builder.SpecNamespace) -> io.StringI
491
491
  from .base_t import JsonScalar as JsonScalar
492
492
  from .base_t import JsonValue as JsonValue
493
493
  from .base_t import ObjectId as ObjectId
494
+ from .base_t import Unknown as Unknown
494
495
  """)
495
496
  else:
496
497
  for stype in namespace.types.values():
@@ -1057,6 +1058,7 @@ base_name_map = {
1057
1058
  builder.BaseTypeName.s_readonly_array: "tuple",
1058
1059
  builder.BaseTypeName.s_union: "typing.Union",
1059
1060
  builder.BaseTypeName.s_literal: "typing.Literal",
1061
+ builder.BaseTypeName.s_unknown: "Unknown",
1060
1062
  }
1061
1063
 
1062
1064
 
@@ -23,6 +23,7 @@ base_name_map = {
23
23
  builder.BaseTypeName.s_string: "string",
24
24
  # UNC: global types
25
25
  builder.BaseTypeName.s_json_value: "JsonValue",
26
+ builder.BaseTypeName.s_unknown: "JsonValue",
26
27
  }
27
28
 
28
29
 
@@ -1,13 +1,15 @@
1
1
  """
2
2
  Types that type_spec will use in the emitted files.
3
3
  """
4
- from typing import Union, Any, TYPE_CHECKING
4
+ from typing import Union, Any, TYPE_CHECKING, Annotated
5
5
  from collections.abc import Mapping, Sequence
6
6
 
7
7
  # These two are part of the core output, thus don't duplicate here
8
8
  # from decimal import Decimal
9
9
  # import datetime
10
10
 
11
+ from pkgs.serialization import UnknownBrand
12
+
11
13
  # Decimal/datetime are included as this list includes JSON serializable objects
12
14
  # It is preferred to use ExtJsonScalar and leave JsonScalar as deprecated, as
13
15
  # a type that we intend on migrating.
@@ -45,6 +47,7 @@ else:
45
47
  ExtJsonValue = JsonValue
46
48
  PureJsonValue = Union[PureJsonScalar, dict[str, Any], list[Any]]
47
49
 
50
+ Unknown = Annotated[object, UnknownBrand]
48
51
  ObjectId = int
49
52
 
50
53
 
@@ -6,11 +6,13 @@ import * as IO from 'io-ts';
6
6
 
7
7
  type localJsonScalar = JsonScalar
8
8
  type localJsonValue = JsonValue
9
+ type localUnknown = JsonValue
9
10
  type localObjectId = ObjectId
10
11
 
11
12
  export type {
12
13
  localJsonScalar as JsonScalar,
13
14
  localJsonValue as JsonValue,
15
+ localUnknown as Unknown,
14
16
  localObjectId as ObjectId,
15
17
  }
16
18
 
@@ -89,11 +89,11 @@ def _dict_null_strip(data: dict[str, object]) -> dict[str, object]:
89
89
 
90
90
 
91
91
  class JsonEncoder(json.JSONEncoder):
92
- def default(self, obj: object) -> object:
93
- if isinstance(obj, decimal.Decimal):
94
- return str(obj)
92
+ def default(self, o: object) -> object:
93
+ if isinstance(o, decimal.Decimal):
94
+ return str(o)
95
95
 
96
- return json.JSONEncoder.default(self, obj)
96
+ return json.JSONEncoder.default(self, o)
97
97
 
98
98
 
99
99
  def emit_type_info(build: builder.SpecBuilder, output: str) -> None:
@@ -124,6 +124,11 @@ BASE_TYPE_NAME_MAP = {
124
124
  def _emit_python_type(value_type: value_spec_t.ValueType) -> str:
125
125
  # IMPROVE: Ideally we'd find a way to translate into type_spec types, or load directly, and
126
126
  # rely on the other conversions. This might be requier to avoid duplication in emitting TypeScript code later
127
+ if value_type.base_type == value_spec_t.BaseType.OPTIONAL:
128
+ assert value_type.parameters is not None and len(value_type.parameters) == 1
129
+ inner_type = _emit_python_type(value_type.parameters[0])
130
+ return f"{inner_type} | None"
131
+
127
132
  out = io.StringIO()
128
133
  out.write(BASE_TYPE_NAME_MAP[value_type.base_type])
129
134
  if value_type.parameters is not None:
@@ -70,13 +70,13 @@ dependencies = [
70
70
  "boto3 == 1.*",
71
71
  "flask == 3.*",
72
72
  "simplejson == 3.*",
73
- "grpcio == 1.67.1",
73
+ "grpcio == 1.78.0",
74
74
  "protobuf >= 4.21.1",
75
75
  "azure-storage-blob == 12.*",
76
76
  "boto3-stubs[essential,ses]==1.*",
77
77
  "msgspec>=0.19,<0.21",
78
78
  "tabulate == 0.9.0",
79
- "types-psutil~=7.1.3",
79
+ "types-psutil~=7.2.1",
80
80
  "psutil>=5.9.0",
81
81
  ]
82
82
  dynamic = ["version"]