UncountablePythonSDK 0.0.85__tar.gz → 0.0.87__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 (301) hide show
  1. {uncountablepythonsdk-0.0.85/UncountablePythonSDK.egg-info → uncountablepythonsdk-0.0.87}/PKG-INFO +3 -2
  2. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87/UncountablePythonSDK.egg-info}/PKG-INFO +3 -2
  3. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/UncountablePythonSDK.egg-info/SOURCES.txt +1 -0
  4. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/UncountablePythonSDK.egg-info/requires.txt +2 -1
  5. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/examples/integration-server/pyproject.toml +1 -1
  6. uncountablepythonsdk-0.0.87/pkgs/filesystem_utils/_blob_session.py +137 -0
  7. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/pkgs/filesystem_utils/file_type_utils.py +20 -0
  8. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/pkgs/serialization/serial_class.py +0 -2
  9. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/pkgs/type_spec/actions_registry/emit_typescript.py +1 -3
  10. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/pyproject.toml +4 -3
  11. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/integration/executors/executors.py +13 -2
  12. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/integration/queue_runner/worker.py +1 -0
  13. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/types/api/recipes/edit_recipe_inputs.py +66 -1
  14. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/types/entity_t.py +4 -0
  15. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/types/integration_server_t.py +5 -0
  16. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/.github/workflows/documentation.yml +0 -0
  17. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/.github/workflows/publish.yml +0 -0
  18. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/.gitignore +0 -0
  19. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/README.md +0 -0
  20. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/UncountablePythonSDK.egg-info/dependency_links.txt +0 -0
  21. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/UncountablePythonSDK.egg-info/top_level.txt +0 -0
  22. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/docs/.gitignore +0 -0
  23. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/docs/conf.py +0 -0
  24. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/docs/index.md +0 -0
  25. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/docs/justfile +0 -0
  26. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/docs/quickstart.md +0 -0
  27. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/docs/requirements.txt +0 -0
  28. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/docs/static/favicons/android-chrome-192x192.png +0 -0
  29. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/docs/static/favicons/android-chrome-512x512.png +0 -0
  30. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/docs/static/favicons/apple-touch-icon.png +0 -0
  31. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/docs/static/favicons/browserconfig.xml +0 -0
  32. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/docs/static/favicons/favicon-16x16.png +0 -0
  33. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/docs/static/favicons/favicon-32x32.png +0 -0
  34. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/docs/static/favicons/manifest.json +0 -0
  35. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/docs/static/favicons/mstile-150x150.png +0 -0
  36. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/docs/static/favicons/safari-pinned-tab.svg +0 -0
  37. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/docs/static/logo_blue.png +0 -0
  38. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/examples/async_batch.py +0 -0
  39. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/examples/create_entity.py +0 -0
  40. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/examples/edit_recipe_inputs.py +0 -0
  41. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/examples/integration-server/jobs/materials_auto/example_cron.py +0 -0
  42. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/examples/integration-server/jobs/materials_auto/example_wh.py +0 -0
  43. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/examples/integration-server/jobs/materials_auto/profile.yaml +0 -0
  44. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/examples/invoke_uploader.py +0 -0
  45. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/examples/set_recipe_metadata_file.py +0 -0
  46. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/examples/set_recipe_output_file_sdk.py +0 -0
  47. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/examples/upload_files.py +0 -0
  48. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/pkgs/__init__.py +0 -0
  49. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/pkgs/argument_parser/__init__.py +0 -0
  50. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/pkgs/argument_parser/_is_enum.py +0 -0
  51. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/pkgs/argument_parser/_is_namedtuple.py +0 -0
  52. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/pkgs/argument_parser/argument_parser.py +0 -0
  53. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/pkgs/argument_parser/case_convert.py +0 -0
  54. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/pkgs/filesystem_utils/__init__.py +0 -0
  55. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/pkgs/filesystem_utils/_gdrive_session.py +0 -0
  56. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/pkgs/filesystem_utils/_local_session.py +0 -0
  57. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/pkgs/filesystem_utils/_s3_session.py +0 -0
  58. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/pkgs/filesystem_utils/_sftp_session.py +0 -0
  59. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/pkgs/filesystem_utils/filesystem_session.py +0 -0
  60. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/pkgs/py.typed +0 -0
  61. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/pkgs/serialization/__init__.py +0 -0
  62. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/pkgs/serialization/missing_sentry.py +0 -0
  63. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/pkgs/serialization/opaque_key.py +0 -0
  64. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/pkgs/serialization/serial_union.py +0 -0
  65. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/pkgs/serialization/yaml.py +0 -0
  66. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/pkgs/serialization_util/__init__.py +0 -0
  67. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/pkgs/serialization_util/_get_type_for_serialization.py +0 -0
  68. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/pkgs/serialization_util/convert_to_snakecase.py +0 -0
  69. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/pkgs/serialization_util/serialization_helpers.py +0 -0
  70. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/pkgs/strenum_compat/__init__.py +0 -0
  71. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/pkgs/strenum_compat/strenum_compat.py +0 -0
  72. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/pkgs/type_spec/__init__.py +0 -0
  73. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/pkgs/type_spec/__main__.py +0 -0
  74. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/pkgs/type_spec/actions_registry/__init__.py +0 -0
  75. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/pkgs/type_spec/actions_registry/__main__.py +0 -0
  76. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/pkgs/type_spec/builder.py +0 -0
  77. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/pkgs/type_spec/config.py +0 -0
  78. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/pkgs/type_spec/emit_io_ts.py +0 -0
  79. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/pkgs/type_spec/emit_open_api.py +0 -0
  80. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/pkgs/type_spec/emit_open_api_util.py +0 -0
  81. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/pkgs/type_spec/emit_python.py +0 -0
  82. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/pkgs/type_spec/emit_typescript.py +0 -0
  83. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/pkgs/type_spec/emit_typescript_util.py +0 -0
  84. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/pkgs/type_spec/load_types.py +0 -0
  85. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/pkgs/type_spec/open_api_util.py +0 -0
  86. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/pkgs/type_spec/parts/base.py.prepart +0 -0
  87. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/pkgs/type_spec/parts/base.ts.prepart +0 -0
  88. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/pkgs/type_spec/test.py +0 -0
  89. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/pkgs/type_spec/type_info/__main__.py +0 -0
  90. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/pkgs/type_spec/type_info/emit_type_info.py +0 -0
  91. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/pkgs/type_spec/util.py +0 -0
  92. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/pkgs/type_spec/value_spec/__init__.py +0 -0
  93. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/pkgs/type_spec/value_spec/__main__.py +0 -0
  94. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/pkgs/type_spec/value_spec/convert_type.py +0 -0
  95. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/pkgs/type_spec/value_spec/emit_python.py +0 -0
  96. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/pkgs/type_spec/value_spec/types.py +0 -0
  97. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/setup.cfg +0 -0
  98. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/__init__.py +0 -0
  99. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/core/__init__.py +0 -0
  100. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/core/async_batch.py +0 -0
  101. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/core/client.py +0 -0
  102. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/core/environment.py +0 -0
  103. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/core/file_upload.py +0 -0
  104. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/core/types.py +0 -0
  105. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/integration/__init__.py +0 -0
  106. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/integration/cli.py +0 -0
  107. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/integration/construct_client.py +0 -0
  108. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/integration/cron.py +0 -0
  109. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/integration/db/__init__.py +0 -0
  110. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/integration/db/connect.py +0 -0
  111. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/integration/db/session.py +0 -0
  112. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/integration/entrypoint.py +0 -0
  113. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/integration/executors/__init__.py +0 -0
  114. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/integration/executors/generic_upload_executor.py +0 -0
  115. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/integration/executors/script_executor.py +0 -0
  116. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/integration/job.py +0 -0
  117. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/integration/queue_runner/__init__.py +0 -0
  118. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/integration/queue_runner/command_server/__init__.py +0 -0
  119. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/integration/queue_runner/command_server/command_client.py +0 -0
  120. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/integration/queue_runner/command_server/command_server.py +0 -0
  121. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/integration/queue_runner/command_server/protocol/__init__.py +0 -0
  122. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/integration/queue_runner/command_server/protocol/command_server.proto +0 -0
  123. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/integration/queue_runner/command_server/protocol/command_server_pb2.py +0 -0
  124. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/integration/queue_runner/command_server/protocol/command_server_pb2.pyi +0 -0
  125. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/integration/queue_runner/command_server/protocol/command_server_pb2_grpc.py +0 -0
  126. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/integration/queue_runner/command_server/types.py +0 -0
  127. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/integration/queue_runner/datastore/__init__.py +0 -0
  128. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/integration/queue_runner/datastore/datastore_sqlite.py +0 -0
  129. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/integration/queue_runner/datastore/interface.py +0 -0
  130. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/integration/queue_runner/datastore/model.py +0 -0
  131. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/integration/queue_runner/job_scheduler.py +0 -0
  132. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/integration/queue_runner/queue_runner.py +0 -0
  133. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/integration/queue_runner/types.py +0 -0
  134. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/integration/scan_profiles.py +0 -0
  135. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/integration/scheduler.py +0 -0
  136. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/integration/secret_retrieval/__init__.py +0 -0
  137. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/integration/secret_retrieval/retrieve_secret.py +0 -0
  138. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/integration/server.py +0 -0
  139. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/integration/telemetry.py +0 -0
  140. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/integration/webhook_server/entrypoint.py +0 -0
  141. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/py.typed +0 -0
  142. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/types/__init__.py +0 -0
  143. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/types/api/__init__.py +0 -0
  144. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/types/api/batch/__init__.py +0 -0
  145. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/types/api/batch/execute_batch.py +0 -0
  146. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/types/api/batch/execute_batch_load_async.py +0 -0
  147. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/types/api/chemical/__init__.py +0 -0
  148. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/types/api/chemical/convert_chemical_formats.py +0 -0
  149. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/types/api/entity/__init__.py +0 -0
  150. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/types/api/entity/create_entities.py +0 -0
  151. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/types/api/entity/create_entity.py +0 -0
  152. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/types/api/entity/get_entities_data.py +0 -0
  153. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/types/api/entity/grant_entity_permissions.py +0 -0
  154. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/types/api/entity/list_entities.py +0 -0
  155. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/types/api/entity/lock_entity.py +0 -0
  156. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/types/api/entity/resolve_entity_ids.py +0 -0
  157. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/types/api/entity/set_values.py +0 -0
  158. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/types/api/entity/transition_entity_phase.py +0 -0
  159. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/types/api/entity/unlock_entity.py +0 -0
  160. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/types/api/equipment/__init__.py +0 -0
  161. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/types/api/equipment/associate_equipment_input.py +0 -0
  162. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/types/api/field_options/__init__.py +0 -0
  163. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/types/api/field_options/upsert_field_options.py +0 -0
  164. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/types/api/id_source/__init__.py +0 -0
  165. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/types/api/id_source/list_id_source.py +0 -0
  166. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/types/api/id_source/match_id_source.py +0 -0
  167. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/types/api/input_groups/__init__.py +0 -0
  168. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/types/api/input_groups/get_input_group_names.py +0 -0
  169. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/types/api/inputs/__init__.py +0 -0
  170. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/types/api/inputs/create_inputs.py +0 -0
  171. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/types/api/inputs/get_input_data.py +0 -0
  172. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/types/api/inputs/get_input_names.py +0 -0
  173. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/types/api/inputs/get_inputs_data.py +0 -0
  174. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/types/api/inputs/set_input_attribute_values.py +0 -0
  175. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/types/api/inputs/set_input_category.py +0 -0
  176. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/types/api/inputs/set_input_subcategories.py +0 -0
  177. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/types/api/inputs/set_intermediate_type.py +0 -0
  178. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/types/api/material_families/__init__.py +0 -0
  179. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/types/api/material_families/update_entity_material_families.py +0 -0
  180. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/types/api/outputs/__init__.py +0 -0
  181. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/types/api/outputs/get_output_data.py +0 -0
  182. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/types/api/outputs/get_output_names.py +0 -0
  183. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/types/api/outputs/resolve_output_conditions.py +0 -0
  184. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/types/api/permissions/__init__.py +0 -0
  185. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/types/api/permissions/set_core_permissions.py +0 -0
  186. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/types/api/project/__init__.py +0 -0
  187. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/types/api/project/get_projects.py +0 -0
  188. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/types/api/project/get_projects_data.py +0 -0
  189. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/types/api/recipe_links/__init__.py +0 -0
  190. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/types/api/recipe_links/create_recipe_link.py +0 -0
  191. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/types/api/recipe_links/remove_recipe_link.py +0 -0
  192. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/types/api/recipe_metadata/__init__.py +0 -0
  193. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/types/api/recipe_metadata/get_recipe_metadata_data.py +0 -0
  194. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/types/api/recipes/__init__.py +0 -0
  195. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/types/api/recipes/add_recipe_to_project.py +0 -0
  196. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/types/api/recipes/archive_recipes.py +0 -0
  197. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/types/api/recipes/associate_recipe_as_input.py +0 -0
  198. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/types/api/recipes/associate_recipe_as_lot.py +0 -0
  199. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/types/api/recipes/clear_recipe_outputs.py +0 -0
  200. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/types/api/recipes/create_recipe.py +0 -0
  201. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/types/api/recipes/create_recipes.py +0 -0
  202. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/types/api/recipes/disassociate_recipe_as_input.py +0 -0
  203. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/types/api/recipes/get_column_calculation_values.py +0 -0
  204. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/types/api/recipes/get_curve.py +0 -0
  205. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/types/api/recipes/get_recipe_calculations.py +0 -0
  206. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/types/api/recipes/get_recipe_links.py +0 -0
  207. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/types/api/recipes/get_recipe_names.py +0 -0
  208. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/types/api/recipes/get_recipe_output_metadata.py +0 -0
  209. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/types/api/recipes/get_recipes_data.py +0 -0
  210. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/types/api/recipes/lock_recipes.py +0 -0
  211. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/types/api/recipes/remove_recipe_from_project.py +0 -0
  212. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/types/api/recipes/set_recipe_inputs.py +0 -0
  213. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/types/api/recipes/set_recipe_metadata.py +0 -0
  214. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/types/api/recipes/set_recipe_output_annotations.py +0 -0
  215. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/types/api/recipes/set_recipe_output_file.py +0 -0
  216. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/types/api/recipes/set_recipe_outputs.py +0 -0
  217. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/types/api/recipes/set_recipe_tags.py +0 -0
  218. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/types/api/recipes/unarchive_recipes.py +0 -0
  219. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/types/api/recipes/unlock_recipes.py +0 -0
  220. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/types/api/triggers/__init__.py +0 -0
  221. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/types/api/triggers/run_trigger.py +0 -0
  222. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/types/api/uploader/__init__.py +0 -0
  223. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/types/api/uploader/invoke_uploader.py +0 -0
  224. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/types/async_batch.py +0 -0
  225. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/types/async_batch_processor.py +0 -0
  226. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/types/async_batch_t.py +0 -0
  227. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/types/async_jobs.py +0 -0
  228. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/types/async_jobs_t.py +0 -0
  229. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/types/auth_retrieval.py +0 -0
  230. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/types/auth_retrieval_t.py +0 -0
  231. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/types/base.py +0 -0
  232. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/types/base_t.py +0 -0
  233. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/types/calculations.py +0 -0
  234. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/types/calculations_t.py +0 -0
  235. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/types/chemical_structure.py +0 -0
  236. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/types/chemical_structure_t.py +0 -0
  237. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/types/client_base.py +0 -0
  238. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/types/client_config.py +0 -0
  239. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/types/client_config_t.py +0 -0
  240. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/types/curves.py +0 -0
  241. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/types/curves_t.py +0 -0
  242. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/types/entity.py +0 -0
  243. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/types/experiment_groups.py +0 -0
  244. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/types/experiment_groups_t.py +0 -0
  245. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/types/field_values.py +0 -0
  246. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/types/field_values_t.py +0 -0
  247. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/types/fields.py +0 -0
  248. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/types/fields_t.py +0 -0
  249. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/types/generic_upload.py +0 -0
  250. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/types/generic_upload_t.py +0 -0
  251. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/types/id_source.py +0 -0
  252. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/types/id_source_t.py +0 -0
  253. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/types/identifier.py +0 -0
  254. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/types/identifier_t.py +0 -0
  255. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/types/input_attributes.py +0 -0
  256. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/types/input_attributes_t.py +0 -0
  257. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/types/inputs.py +0 -0
  258. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/types/inputs_t.py +0 -0
  259. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/types/integration_server.py +0 -0
  260. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/types/job_definition.py +0 -0
  261. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/types/job_definition_t.py +0 -0
  262. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/types/outputs.py +0 -0
  263. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/types/outputs_t.py +0 -0
  264. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/types/overrides.py +0 -0
  265. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/types/overrides_t.py +0 -0
  266. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/types/permissions.py +0 -0
  267. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/types/permissions_t.py +0 -0
  268. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/types/phases.py +0 -0
  269. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/types/phases_t.py +0 -0
  270. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/types/post_base.py +0 -0
  271. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/types/post_base_t.py +0 -0
  272. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/types/queued_job.py +0 -0
  273. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/types/queued_job_t.py +0 -0
  274. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/types/recipe_identifiers.py +0 -0
  275. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/types/recipe_identifiers_t.py +0 -0
  276. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/types/recipe_inputs.py +0 -0
  277. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/types/recipe_inputs_t.py +0 -0
  278. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/types/recipe_links.py +0 -0
  279. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/types/recipe_links_t.py +0 -0
  280. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/types/recipe_metadata.py +0 -0
  281. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/types/recipe_metadata_t.py +0 -0
  282. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/types/recipe_output_metadata.py +0 -0
  283. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/types/recipe_output_metadata_t.py +0 -0
  284. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/types/recipe_tags.py +0 -0
  285. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/types/recipe_tags_t.py +0 -0
  286. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/types/recipe_workflow_steps.py +0 -0
  287. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/types/recipe_workflow_steps_t.py +0 -0
  288. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/types/recipes.py +0 -0
  289. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/types/recipes_t.py +0 -0
  290. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/types/response.py +0 -0
  291. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/types/response_t.py +0 -0
  292. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/types/secret_retrieval.py +0 -0
  293. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/types/secret_retrieval_t.py +0 -0
  294. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/types/units.py +0 -0
  295. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/types/units_t.py +0 -0
  296. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/types/users.py +0 -0
  297. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/types/users_t.py +0 -0
  298. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/types/webhook_job.py +0 -0
  299. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/types/webhook_job_t.py +0 -0
  300. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/types/workflows.py +0 -0
  301. {uncountablepythonsdk-0.0.85 → uncountablepythonsdk-0.0.87}/uncountable/types/workflows_t.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: UncountablePythonSDK
3
- Version: 0.0.85
3
+ Version: 0.0.87
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
@@ -36,7 +36,8 @@ Requires-Dist: boto3==1.*
36
36
  Requires-Dist: flask==3.*
37
37
  Requires-Dist: simplejson==3.*
38
38
  Requires-Dist: grpcio==1.67.1
39
- Requires-Dist: protobuf==4.*
39
+ Requires-Dist: protobuf>=4.21.1
40
+ Requires-Dist: azure-storage-blob==12.*
40
41
  Provides-Extra: test
41
42
  Requires-Dist: mypy==1.*; extra == "test"
42
43
  Requires-Dist: ruff==0.*; extra == "test"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: UncountablePythonSDK
3
- Version: 0.0.85
3
+ Version: 0.0.87
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
@@ -36,7 +36,8 @@ Requires-Dist: boto3==1.*
36
36
  Requires-Dist: flask==3.*
37
37
  Requires-Dist: simplejson==3.*
38
38
  Requires-Dist: grpcio==1.67.1
39
- Requires-Dist: protobuf==4.*
39
+ Requires-Dist: protobuf>=4.21.1
40
+ Requires-Dist: azure-storage-blob==12.*
40
41
  Provides-Extra: test
41
42
  Requires-Dist: mypy==1.*; extra == "test"
42
43
  Requires-Dist: ruff==0.*; extra == "test"
@@ -43,6 +43,7 @@ pkgs/argument_parser/_is_namedtuple.py
43
43
  pkgs/argument_parser/argument_parser.py
44
44
  pkgs/argument_parser/case_convert.py
45
45
  pkgs/filesystem_utils/__init__.py
46
+ pkgs/filesystem_utils/_blob_session.py
46
47
  pkgs/filesystem_utils/_gdrive_session.py
47
48
  pkgs/filesystem_utils/_local_session.py
48
49
  pkgs/filesystem_utils/_s3_session.py
@@ -18,7 +18,8 @@ boto3==1.*
18
18
  flask==3.*
19
19
  simplejson==3.*
20
20
  grpcio==1.67.1
21
- protobuf==4.*
21
+ protobuf>=4.21.1
22
+ azure-storage-blob==12.*
22
23
 
23
24
  [test]
24
25
  mypy==1.*
@@ -197,7 +197,7 @@ lint.ignore = [
197
197
  # ## FROM RUFF UPGRADE
198
198
  "PLC2701", # private name imports. should add
199
199
  "PLR1702", # too many nested blocks -- add with config. skip
200
- "RUF025", # unnecessary dict comprehension. skip
200
+ "C420", # unnecessary dict comprehension. skip
201
201
  "SIM113", # index variable should use enumerate. should add.
202
202
  "PLR0914" # too many local variables. configure below. should add with config
203
203
  ]
@@ -0,0 +1,137 @@
1
+ from io import BytesIO
2
+
3
+ from azure.storage.blob import BlobServiceClient, ContainerClient
4
+
5
+ from pkgs.filesystem_utils.file_type_utils import (
6
+ FileObjectData,
7
+ FileSystemBlobConfig,
8
+ FileSystemFileReference,
9
+ FileSystemObject,
10
+ FileTransfer,
11
+ IncompatibleFileReference,
12
+ )
13
+
14
+ from .filesystem_session import FileSystemSession
15
+
16
+
17
+ def _add_slash(prefix: str) -> str:
18
+ if len(prefix) > 0 and prefix[-1] != "/":
19
+ prefix = prefix + "/"
20
+ return prefix
21
+
22
+
23
+ class BlobSession(FileSystemSession):
24
+ config: FileSystemBlobConfig
25
+
26
+ def __init__(self, blob_config: FileSystemBlobConfig) -> None:
27
+ super().__init__()
28
+ self.config = blob_config
29
+
30
+ def start(self) -> None:
31
+ self.service_client: BlobServiceClient | None = BlobServiceClient(
32
+ self.config.account_url, credential=self.config.credential
33
+ )
34
+ self.container_client: ContainerClient | None = (
35
+ self.service_client.get_container_client(self.config.container)
36
+ )
37
+
38
+ def __enter__(self) -> "BlobSession":
39
+ self.start()
40
+ return self
41
+
42
+ def __exit__(self, exc_type: object, exc_val: object, exc_tb: object) -> None:
43
+ self.service_client = None
44
+ self.container_client = None
45
+
46
+ def list_files(
47
+ self,
48
+ dir_path: FileSystemObject,
49
+ *,
50
+ recursive: bool = False,
51
+ valid_extensions: list[str] | None = None,
52
+ ) -> list[FileSystemObject]:
53
+ if not isinstance(dir_path, FileSystemFileReference):
54
+ raise IncompatibleFileReference()
55
+
56
+ assert self.service_client is not None and self.container_client is not None, (
57
+ "call to list_files on uninitialized blob session"
58
+ )
59
+
60
+ filesystem_file_references: list[FileSystemObject] = []
61
+ prefix = _add_slash(dir_path.filepath)
62
+ for blob in self.container_client.list_blobs(name_starts_with=prefix):
63
+ if not recursive and (
64
+ blob.name == prefix or "/" in blob.name[len(prefix) :]
65
+ ):
66
+ continue
67
+ if valid_extensions is None or any(
68
+ blob.name.endswith(valid_extension)
69
+ for valid_extension in valid_extensions
70
+ ):
71
+ filesystem_file_references.append(
72
+ FileSystemFileReference(
73
+ filepath=blob.name,
74
+ )
75
+ )
76
+
77
+ return filesystem_file_references
78
+
79
+ def download_files(
80
+ self,
81
+ filepaths: list[FileSystemObject],
82
+ ) -> list[FileObjectData]:
83
+ downloaded_files: list[FileObjectData] = []
84
+ assert self.service_client is not None and self.container_client is not None, (
85
+ "call to download_files on uninitialized blob session"
86
+ )
87
+
88
+ for file_object in filepaths:
89
+ if (
90
+ not isinstance(file_object, FileSystemFileReference)
91
+ or file_object.filename is None
92
+ ):
93
+ raise IncompatibleFileReference()
94
+
95
+ blob_client = self.container_client.get_blob_client(file_object.filepath)
96
+ download_stream = blob_client.download_blob()
97
+ file_data = download_stream.readall()
98
+ downloaded_files.append(
99
+ FileObjectData(
100
+ file_data=file_data,
101
+ file_IO=BytesIO(file_data),
102
+ filename=file_object.filename,
103
+ filepath=file_object.filepath,
104
+ )
105
+ )
106
+
107
+ return downloaded_files
108
+
109
+ def move_files(self, file_mappings: list[FileTransfer]) -> None:
110
+ assert self.service_client is not None and self.container_client is not None, (
111
+ "call to move_files on uninitialized blob session"
112
+ )
113
+
114
+ for src_file, dest_file in file_mappings:
115
+ if not isinstance(src_file, FileSystemFileReference) or not isinstance(
116
+ dest_file, FileSystemFileReference
117
+ ):
118
+ raise IncompatibleFileReference()
119
+
120
+ source_blob_client = self.container_client.get_blob_client(
121
+ src_file.filepath
122
+ )
123
+ dest_blob_client = self.container_client.get_blob_client(dest_file.filepath)
124
+
125
+ dest_blob_client.start_copy_from_url(source_blob_client.url)
126
+ source_blob_client.delete_blob()
127
+
128
+ def delete_files(self, filepaths: list[FileSystemObject]) -> None:
129
+ assert self.service_client is not None and self.container_client is not None, (
130
+ "call to delete_files on uninitialized blob session"
131
+ )
132
+ for file_object in filepaths:
133
+ if not isinstance(file_object, FileSystemFileReference):
134
+ raise IncompatibleFileReference()
135
+
136
+ blob_client = self.container_client.get_blob_client(file_object.filepath)
137
+ blob_client.delete_blob()
@@ -4,6 +4,12 @@ from io import BytesIO
4
4
  from typing import Optional, Union
5
5
 
6
6
  import paramiko
7
+ from azure.core.credentials import (
8
+ AzureNamedKeyCredential,
9
+ AzureSasCredential,
10
+ TokenCredential,
11
+ )
12
+ from azure.storage.blob import ContainerProperties
7
13
 
8
14
 
9
15
  @dataclass
@@ -69,3 +75,17 @@ class FileSystemS3Config:
69
75
  access_key_id: Optional[str]
70
76
  secret_access_key: Optional[str]
71
77
  session_token: Optional[str]
78
+
79
+
80
+ @dataclass(kw_only=True)
81
+ class FileSystemBlobConfig:
82
+ account_url: str
83
+ credential: (
84
+ str
85
+ | dict[str, str]
86
+ | AzureNamedKeyCredential
87
+ | AzureSasCredential
88
+ | TokenCredential
89
+ | None
90
+ )
91
+ container: ContainerProperties | str
@@ -114,8 +114,6 @@ def _get_merged_serial_class_data(type_class: type[Any]) -> _SerialClassData | N
114
114
  for base in type_class.__bases__:
115
115
  curr_base_class_data = _get_merged_serial_class_data(base)
116
116
  if curr_base_class_data is not None:
117
- if base_class_data is None:
118
- base_class_data = _SerialClassData()
119
117
  base_class_data.unconverted_keys |= (
120
118
  curr_base_class_data.unconverted_keys
121
119
  )
@@ -111,9 +111,7 @@ def _get_argument_type(arguments: str | None) -> str | None:
111
111
  argument_parts = arguments.split(".")
112
112
  namespace = argument_parts[0]
113
113
  type_name = argument_parts[1]
114
- if namespace is not None and type_name is not None:
115
- return f"{_action_namespace_name(namespace)}.{type_name}"
116
- return None
114
+ return f"{_action_namespace_name(namespace)}.{type_name}"
117
115
 
118
116
 
119
117
  def _emit_action_definition(
@@ -61,15 +61,16 @@ dependencies = [
61
61
  "tqdm == 4.*",
62
62
  "pysftp == 0.*",
63
63
  "opentelemetry-api==1.*",
64
- "opentelemetry-exporter-otlp-proto-common==1.*",
65
- "opentelemetry-exporter-otlp-proto-http==1.*",
64
+ "opentelemetry-exporter-otlp-proto-common==1.*",
65
+ "opentelemetry-exporter-otlp-proto-http==1.*",
66
66
  "opentelemetry-sdk==1.*",
67
67
  "paramiko == 3.*",
68
68
  "boto3 == 1.*",
69
69
  "flask == 3.*",
70
70
  "simplejson == 3.*",
71
71
  "grpcio == 1.67.1",
72
- "protobuf == 4.*"
72
+ "protobuf >= 4.21.1",
73
+ "azure-storage-blob == 12.*"
73
74
  ]
74
75
  dynamic = ["version"]
75
76
 
@@ -9,6 +9,7 @@ from uncountable.types import (
9
9
  entity_t,
10
10
  field_values_t,
11
11
  identifier_t,
12
+ integration_server_t,
12
13
  job_definition_t,
13
14
  transition_entity_phase_t,
14
15
  )
@@ -33,7 +34,10 @@ def resolve_executor(
33
34
 
34
35
 
35
36
  def _create_run_entity(
36
- *, client: Client, logging_settings: job_definition_t.JobLoggingSettings
37
+ *,
38
+ client: Client,
39
+ logging_settings: job_definition_t.JobLoggingSettings,
40
+ job_uuid: str,
37
41
  ) -> entity_t.Entity:
38
42
  run_entity = client.create_entity(
39
43
  entity_type=entity_t.EntityType.ASYNC_JOB,
@@ -49,6 +53,10 @@ def _create_run_entity(
49
53
  field_ref_name=async_jobs_t.ASYNC_JOB_STATUS_FIELD_REF_NAME,
50
54
  value=async_jobs_t.AsyncJobStatus.IN_PROGRESS,
51
55
  ),
56
+ field_values_t.FieldRefNameValue(
57
+ field_ref_name=integration_server_t.INTEGRATION_SERVER_RUN_UUID_FIELD_REF_NAME,
58
+ value=job_uuid,
59
+ ),
52
60
  ],
53
61
  ).entity
54
62
  client.transition_entity_phase(
@@ -80,6 +88,7 @@ def execute_job(
80
88
  job_definition: job_definition_t.JobDefinition,
81
89
  profile_metadata: job_definition_t.ProfileMetadata,
82
90
  args: JobArguments,
91
+ job_uuid: str,
83
92
  ) -> job_definition_t.JobResult:
84
93
  with args.logger.push_scope(job_definition.name) as job_logger:
85
94
  job = resolve_executor(job_definition.executor, profile_metadata)
@@ -93,7 +102,9 @@ def execute_job(
93
102
  and job_definition.logging_settings.enabled
94
103
  ):
95
104
  run_entity = _create_run_entity(
96
- client=args.client, logging_settings=job_definition.logging_settings
105
+ client=args.client,
106
+ logging_settings=job_definition.logging_settings,
107
+ job_uuid=job_uuid,
97
108
  )
98
109
  result = job.run_outer(args=args)
99
110
  except Exception as e:
@@ -109,6 +109,7 @@ def run_queued_job(
109
109
  args=args,
110
110
  profile_metadata=job_details.profile_metadata,
111
111
  job_definition=job_details.job_definition,
112
+ job_uuid=queued_job.queued_job_uuid,
112
113
  )
113
114
  except Exception as e:
114
115
  job_logger.log_exception(e)
@@ -22,6 +22,9 @@ __all__: list[str] = [
22
22
  "Data",
23
23
  "ENDPOINT_METHOD",
24
24
  "ENDPOINT_PATH",
25
+ "PlaceholderBase",
26
+ "PlaceholderDisplayMode",
27
+ "PlaceholderType",
25
28
  "RecipeInputEdit",
26
29
  "RecipeInputEditAddInput",
27
30
  "RecipeInputEditAddInstructions",
@@ -29,11 +32,14 @@ __all__: list[str] = [
29
32
  "RecipeInputEditChangeBasisViewed",
30
33
  "RecipeInputEditClearInputs",
31
34
  "RecipeInputEditInputBase",
35
+ "RecipeInputEditPlaceholder",
32
36
  "RecipeInputEditSetLot",
33
37
  "RecipeInputEditSetRole",
34
38
  "RecipeInputEditType",
35
39
  "RecipeInputEditUpdateAnnotations",
36
40
  "RecipeInputEditUpsertInput",
41
+ "RecipeInputPlaceholder",
42
+ "SubcategoryPlaceholder",
37
43
  ]
38
44
 
39
45
  ENDPOINT_METHOD = "POST"
@@ -50,6 +56,7 @@ class RecipeInputEditType(StrEnum):
50
56
  CHANGE_BASIS = "change_basis"
51
57
  ADD_INSTRUCTIONS = "add_instructions"
52
58
  SET_ROLE = "set_role"
59
+ SET_PLACEHOLDER = "set_placeholder"
53
60
 
54
61
 
55
62
  # DO NOT MODIFY -- This file is generated by type_spec
@@ -177,9 +184,66 @@ class RecipeInputEditSetRole(RecipeInputEditBase):
177
184
  ingredient_role_key: typing.Optional[identifier_t.IdentifierKey]
178
185
 
179
186
 
187
+ # DO NOT MODIFY -- This file is generated by type_spec
188
+ class PlaceholderType(StrEnum):
189
+ SUBCATEGORY = "subcategory"
190
+
191
+
192
+ # DO NOT MODIFY -- This file is generated by type_spec
193
+ class PlaceholderDisplayMode(StrEnum):
194
+ INLINE = "inline"
195
+
196
+
197
+ # DO NOT MODIFY -- This file is generated by type_spec
198
+ @serial_class(
199
+ named_type_path="sdk.api.recipes.edit_recipe_inputs.PlaceholderBase",
200
+ )
201
+ @dataclasses.dataclass(kw_only=True)
202
+ class PlaceholderBase:
203
+ type: PlaceholderType
204
+ require_for_creation: bool = True
205
+ display_mode: PlaceholderDisplayMode = PlaceholderDisplayMode.INLINE
206
+
207
+
208
+ # DO NOT MODIFY -- This file is generated by type_spec
209
+ @serial_class(
210
+ named_type_path="sdk.api.recipes.edit_recipe_inputs.SubcategoryPlaceholder",
211
+ parse_require={"type"},
212
+ )
213
+ @dataclasses.dataclass(kw_only=True)
214
+ class SubcategoryPlaceholder(PlaceholderBase):
215
+ type: typing.Literal[PlaceholderType.SUBCATEGORY] = PlaceholderType.SUBCATEGORY
216
+ subcategory_identifier: identifier_t.IdentifierKey
217
+
218
+
219
+ # DO NOT MODIFY -- This file is generated by type_spec
220
+ RecipeInputPlaceholder = typing.Annotated[
221
+ typing.Union[SubcategoryPlaceholder],
222
+ serial_union_annotation(
223
+ named_type_path="sdk.api.recipes.edit_recipe_inputs.RecipeInputPlaceholder",
224
+ discriminator="type",
225
+ discriminator_map={
226
+ "subcategory": SubcategoryPlaceholder,
227
+ },
228
+ ),
229
+ ]
230
+
231
+
232
+ # DO NOT MODIFY -- This file is generated by type_spec
233
+ @serial_class(
234
+ named_type_path="sdk.api.recipes.edit_recipe_inputs.RecipeInputEditPlaceholder",
235
+ parse_require={"type"},
236
+ )
237
+ @dataclasses.dataclass(kw_only=True)
238
+ class RecipeInputEditPlaceholder(RecipeInputEditBase):
239
+ type: typing.Literal[RecipeInputEditType.SET_PLACEHOLDER] = RecipeInputEditType.SET_PLACEHOLDER
240
+ ingredient_key: identifier_t.IdentifierKey
241
+ placeholder: RecipeInputPlaceholder
242
+
243
+
180
244
  # DO NOT MODIFY -- This file is generated by type_spec
181
245
  RecipeInputEdit = typing.Annotated[
182
- typing.Union[RecipeInputEditClearInputs, RecipeInputEditUpsertInput, RecipeInputEditAddInput, RecipeInputEditUpdateAnnotations, RecipeInputEditSetLot, RecipeInputEditChangeBasisViewed, RecipeInputEditAddInstructions, RecipeInputEditSetRole],
246
+ typing.Union[RecipeInputEditClearInputs, RecipeInputEditUpsertInput, RecipeInputEditAddInput, RecipeInputEditUpdateAnnotations, RecipeInputEditSetLot, RecipeInputEditChangeBasisViewed, RecipeInputEditAddInstructions, RecipeInputEditSetRole, RecipeInputEditPlaceholder],
183
247
  serial_union_annotation(
184
248
  named_type_path="sdk.api.recipes.edit_recipe_inputs.RecipeInputEdit",
185
249
  discriminator="type",
@@ -192,6 +256,7 @@ RecipeInputEdit = typing.Annotated[
192
256
  "change_basis": RecipeInputEditChangeBasisViewed,
193
257
  "add_instructions": RecipeInputEditAddInstructions,
194
258
  "set_role": RecipeInputEditSetRole,
259
+ "set_placeholder": RecipeInputEditPlaceholder,
195
260
  },
196
261
  ),
197
262
  ]
@@ -60,6 +60,7 @@ __all__: list[str] = [
60
60
  "equipment_maintenance": "Equipment Maintenance",
61
61
  "equipment_type": "Equipment Type",
62
62
  "experiment_group": "Experiment Group",
63
+ "experiment_group_member": "Experiment Group Member",
63
64
  "experiment_group_type": "Experiment Group Type",
64
65
  "favorite_link": "Favorite Link",
65
66
  "field_option_set": "Field Option Set",
@@ -89,6 +90,7 @@ __all__: list[str] = [
89
90
  "license": "License",
90
91
  "maintenance_schedule": "Maintenance Schedule",
91
92
  "material_family": "Material Family",
93
+ "measurement_group_recipe": "Measurement Group Recipe",
92
94
  "ml_job": "Batch Processing Job",
93
95
  "naming_scheme": "Naming Scheme",
94
96
  "naming_counter": "Naming Counter",
@@ -217,6 +219,7 @@ class EntityType(StrEnum):
217
219
  EQUIPMENT_MAINTENANCE = "equipment_maintenance"
218
220
  EQUIPMENT_TYPE = "equipment_type"
219
221
  EXPERIMENT_GROUP = "experiment_group"
222
+ EXPERIMENT_GROUP_MEMBER = "experiment_group_member"
220
223
  EXPERIMENT_GROUP_TYPE = "experiment_group_type"
221
224
  FAVORITE_LINK = "favorite_link"
222
225
  FIELD_OPTION_SET = "field_option_set"
@@ -246,6 +249,7 @@ class EntityType(StrEnum):
246
249
  LICENSE = "license"
247
250
  MAINTENANCE_SCHEDULE = "maintenance_schedule"
248
251
  MATERIAL_FAMILY = "material_family"
252
+ MEASUREMENT_GROUP_RECIPE = "measurement_group_recipe"
249
253
  ML_JOB = "ml_job"
250
254
  NAMING_SCHEME = "naming_scheme"
251
255
  NAMING_COUNTER = "naming_counter"
@@ -15,6 +15,7 @@ from . import client_config_t
15
15
 
16
16
  __all__: list[str] = [
17
17
  "EnvironmentConfig",
18
+ "INTEGRATION_SERVER_RUN_UUID_FIELD_REF_NAME",
18
19
  "IntegrationEnvironment",
19
20
  ]
20
21
 
@@ -34,4 +35,8 @@ class EnvironmentConfig:
34
35
  auth_retrieval: auth_retrieval_t.AuthRetrieval
35
36
  base_url: str
36
37
  client_options: typing.Optional[client_config_t.ClientConfigOptions] = None
38
+
39
+
40
+ # DO NOT MODIFY -- This file is generated by type_spec
41
+ INTEGRATION_SERVER_RUN_UUID_FIELD_REF_NAME = "unc_integration_server_run_uuid"
37
42
  # DO NOT MODIFY -- This file is generated by type_spec