UncountablePythonSDK 0.0.75__tar.gz → 0.0.76__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 (298) hide show
  1. {uncountablepythonsdk-0.0.75/UncountablePythonSDK.egg-info → uncountablepythonsdk-0.0.76}/PKG-INFO +2 -2
  2. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76/UncountablePythonSDK.egg-info}/PKG-INFO +2 -2
  3. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/UncountablePythonSDK.egg-info/SOURCES.txt +6 -0
  4. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/UncountablePythonSDK.egg-info/requires.txt +1 -1
  5. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/docs/requirements.txt +1 -1
  6. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/examples/async_batch.py +3 -3
  7. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/pkgs/serialization/serial_class.py +3 -0
  8. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/pkgs/type_spec/builder.py +7 -8
  9. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/pkgs/type_spec/emit_python.py +6 -6
  10. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/pyproject.toml +1 -1
  11. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/core/environment.py +15 -2
  12. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/integration/construct_client.py +3 -4
  13. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/integration/queue_runner/job_scheduler.py +1 -1
  14. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/integration/queue_runner/worker.py +3 -8
  15. uncountablepythonsdk-0.0.76/uncountable/integration/scan_profiles.py +67 -0
  16. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/integration/server.py +4 -12
  17. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/integration/telemetry.py +2 -2
  18. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/integration/webhook_server/entrypoint.py +4 -10
  19. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/types/__init__.py +8 -0
  20. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/types/api/entity/create_entities.py +4 -2
  21. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/types/api/entity/create_entity.py +4 -2
  22. uncountablepythonsdk-0.0.76/uncountable/types/api/entity/grant_entity_permissions.py +48 -0
  23. uncountablepythonsdk-0.0.76/uncountable/types/api/recipes/get_column_calculation_values.py +58 -0
  24. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/types/async_batch_processor.py +43 -0
  25. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/types/async_batch_t.py +1 -0
  26. uncountablepythonsdk-0.0.76/uncountable/types/auth_retrieval.py +12 -0
  27. uncountablepythonsdk-0.0.76/uncountable/types/auth_retrieval_t.py +75 -0
  28. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/types/client_base.py +62 -4
  29. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/types/entity.py +3 -0
  30. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/types/entity_t.py +20 -0
  31. uncountablepythonsdk-0.0.76/uncountable/types/integration_server.py +9 -0
  32. uncountablepythonsdk-0.0.76/uncountable/types/integration_server_t.py +37 -0
  33. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/types/job_definition.py +1 -5
  34. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/types/job_definition_t.py +20 -60
  35. uncountablepythonsdk-0.0.75/uncountable/integration/scan_profiles.py +0 -43
  36. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/.github/workflows/documentation.yml +0 -0
  37. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/.github/workflows/publish.yml +0 -0
  38. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/.gitignore +0 -0
  39. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/README.md +0 -0
  40. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/UncountablePythonSDK.egg-info/dependency_links.txt +0 -0
  41. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/UncountablePythonSDK.egg-info/top_level.txt +0 -0
  42. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/docs/.gitignore +0 -0
  43. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/docs/conf.py +0 -0
  44. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/docs/index.md +0 -0
  45. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/docs/justfile +0 -0
  46. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/docs/quickstart.md +0 -0
  47. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/docs/static/favicons/android-chrome-192x192.png +0 -0
  48. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/docs/static/favicons/android-chrome-512x512.png +0 -0
  49. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/docs/static/favicons/apple-touch-icon.png +0 -0
  50. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/docs/static/favicons/browserconfig.xml +0 -0
  51. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/docs/static/favicons/favicon-16x16.png +0 -0
  52. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/docs/static/favicons/favicon-32x32.png +0 -0
  53. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/docs/static/favicons/manifest.json +0 -0
  54. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/docs/static/favicons/mstile-150x150.png +0 -0
  55. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/docs/static/favicons/safari-pinned-tab.svg +0 -0
  56. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/docs/static/logo_blue.png +0 -0
  57. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/examples/create_entity.py +0 -0
  58. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/examples/edit_recipe_inputs.py +0 -0
  59. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/examples/integration-server/jobs/materials_auto/example_cron.py +0 -0
  60. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/examples/integration-server/jobs/materials_auto/profile.yaml +0 -0
  61. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/examples/integration-server/pyproject.toml +0 -0
  62. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/examples/invoke_uploader.py +0 -0
  63. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/examples/set_recipe_metadata_file.py +0 -0
  64. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/examples/set_recipe_output_file_sdk.py +0 -0
  65. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/examples/upload_files.py +0 -0
  66. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/pkgs/__init__.py +0 -0
  67. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/pkgs/argument_parser/__init__.py +0 -0
  68. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/pkgs/argument_parser/_is_enum.py +0 -0
  69. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/pkgs/argument_parser/_is_namedtuple.py +0 -0
  70. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/pkgs/argument_parser/argument_parser.py +0 -0
  71. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/pkgs/argument_parser/case_convert.py +0 -0
  72. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/pkgs/filesystem_utils/__init__.py +0 -0
  73. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/pkgs/filesystem_utils/_gdrive_session.py +0 -0
  74. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/pkgs/filesystem_utils/_local_session.py +0 -0
  75. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/pkgs/filesystem_utils/_s3_session.py +0 -0
  76. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/pkgs/filesystem_utils/_sftp_session.py +0 -0
  77. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/pkgs/filesystem_utils/file_type_utils.py +0 -0
  78. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/pkgs/filesystem_utils/filesystem_session.py +0 -0
  79. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/pkgs/py.typed +0 -0
  80. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/pkgs/serialization/__init__.py +0 -0
  81. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/pkgs/serialization/missing_sentry.py +0 -0
  82. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/pkgs/serialization/opaque_key.py +0 -0
  83. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/pkgs/serialization/serial_union.py +0 -0
  84. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/pkgs/serialization/yaml.py +0 -0
  85. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/pkgs/serialization_util/__init__.py +0 -0
  86. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/pkgs/serialization_util/_get_type_for_serialization.py +0 -0
  87. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/pkgs/serialization_util/convert_to_snakecase.py +0 -0
  88. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/pkgs/serialization_util/serialization_helpers.py +0 -0
  89. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/pkgs/strenum_compat/__init__.py +0 -0
  90. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/pkgs/strenum_compat/strenum_compat.py +0 -0
  91. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/pkgs/type_spec/__init__.py +0 -0
  92. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/pkgs/type_spec/__main__.py +0 -0
  93. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/pkgs/type_spec/actions_registry/__init__.py +0 -0
  94. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/pkgs/type_spec/actions_registry/__main__.py +0 -0
  95. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/pkgs/type_spec/actions_registry/emit_typescript.py +0 -0
  96. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/pkgs/type_spec/config.py +0 -0
  97. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/pkgs/type_spec/emit_io_ts.py +0 -0
  98. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/pkgs/type_spec/emit_open_api.py +0 -0
  99. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/pkgs/type_spec/emit_open_api_util.py +0 -0
  100. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/pkgs/type_spec/emit_typescript.py +0 -0
  101. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/pkgs/type_spec/emit_typescript_util.py +0 -0
  102. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/pkgs/type_spec/load_types.py +0 -0
  103. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/pkgs/type_spec/open_api_util.py +0 -0
  104. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/pkgs/type_spec/parts/base.py.prepart +0 -0
  105. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/pkgs/type_spec/parts/base.ts.prepart +0 -0
  106. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/pkgs/type_spec/test.py +0 -0
  107. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/pkgs/type_spec/type_info/__main__.py +0 -0
  108. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/pkgs/type_spec/type_info/emit_type_info.py +0 -0
  109. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/pkgs/type_spec/util.py +0 -0
  110. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/pkgs/type_spec/value_spec/__init__.py +0 -0
  111. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/pkgs/type_spec/value_spec/__main__.py +0 -0
  112. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/pkgs/type_spec/value_spec/convert_type.py +0 -0
  113. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/pkgs/type_spec/value_spec/emit_python.py +0 -0
  114. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/pkgs/type_spec/value_spec/types.py +0 -0
  115. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/setup.cfg +0 -0
  116. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/__init__.py +0 -0
  117. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/core/__init__.py +0 -0
  118. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/core/async_batch.py +0 -0
  119. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/core/client.py +0 -0
  120. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/core/file_upload.py +0 -0
  121. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/core/types.py +0 -0
  122. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/integration/__init__.py +0 -0
  123. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/integration/cli.py +0 -0
  124. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/integration/cron.py +0 -0
  125. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/integration/db/__init__.py +0 -0
  126. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/integration/db/connect.py +0 -0
  127. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/integration/db/session.py +0 -0
  128. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/integration/entrypoint.py +0 -0
  129. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/integration/executors/__init__.py +0 -0
  130. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/integration/executors/executors.py +0 -0
  131. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/integration/executors/generic_upload_executor.py +0 -0
  132. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/integration/executors/script_executor.py +0 -0
  133. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/integration/job.py +0 -0
  134. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/integration/queue_runner/__init__.py +0 -0
  135. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/integration/queue_runner/command_server/__init__.py +0 -0
  136. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/integration/queue_runner/command_server/command_client.py +0 -0
  137. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/integration/queue_runner/command_server/command_server.py +0 -0
  138. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/integration/queue_runner/command_server/protocol/__init__.py +0 -0
  139. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/integration/queue_runner/command_server/protocol/command_server.proto +0 -0
  140. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/integration/queue_runner/command_server/protocol/command_server_pb2.py +0 -0
  141. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/integration/queue_runner/command_server/protocol/command_server_pb2.pyi +0 -0
  142. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/integration/queue_runner/command_server/protocol/command_server_pb2_grpc.py +0 -0
  143. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/integration/queue_runner/command_server/types.py +0 -0
  144. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/integration/queue_runner/datastore/__init__.py +0 -0
  145. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/integration/queue_runner/datastore/datastore_sqlite.py +0 -0
  146. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/integration/queue_runner/datastore/interface.py +0 -0
  147. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/integration/queue_runner/datastore/model.py +0 -0
  148. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/integration/queue_runner/queue_runner.py +0 -0
  149. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/integration/queue_runner/types.py +0 -0
  150. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/integration/scheduler.py +0 -0
  151. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/integration/secret_retrieval/__init__.py +0 -0
  152. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/integration/secret_retrieval/retrieve_secret.py +0 -0
  153. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/py.typed +0 -0
  154. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/types/api/__init__.py +0 -0
  155. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/types/api/batch/__init__.py +0 -0
  156. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/types/api/batch/execute_batch.py +0 -0
  157. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/types/api/batch/execute_batch_load_async.py +0 -0
  158. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/types/api/chemical/__init__.py +0 -0
  159. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/types/api/chemical/convert_chemical_formats.py +0 -0
  160. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/types/api/entity/__init__.py +0 -0
  161. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/types/api/entity/get_entities_data.py +0 -0
  162. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/types/api/entity/list_entities.py +0 -0
  163. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/types/api/entity/lock_entity.py +0 -0
  164. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/types/api/entity/resolve_entity_ids.py +0 -0
  165. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/types/api/entity/set_values.py +0 -0
  166. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/types/api/entity/transition_entity_phase.py +0 -0
  167. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/types/api/entity/unlock_entity.py +0 -0
  168. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/types/api/equipment/__init__.py +0 -0
  169. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/types/api/equipment/associate_equipment_input.py +0 -0
  170. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/types/api/field_options/__init__.py +0 -0
  171. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/types/api/field_options/upsert_field_options.py +0 -0
  172. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/types/api/id_source/__init__.py +0 -0
  173. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/types/api/id_source/list_id_source.py +0 -0
  174. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/types/api/id_source/match_id_source.py +0 -0
  175. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/types/api/input_groups/__init__.py +0 -0
  176. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/types/api/input_groups/get_input_group_names.py +0 -0
  177. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/types/api/inputs/__init__.py +0 -0
  178. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/types/api/inputs/create_inputs.py +0 -0
  179. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/types/api/inputs/get_input_data.py +0 -0
  180. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/types/api/inputs/get_input_names.py +0 -0
  181. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/types/api/inputs/get_inputs_data.py +0 -0
  182. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/types/api/inputs/set_input_attribute_values.py +0 -0
  183. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/types/api/inputs/set_input_category.py +0 -0
  184. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/types/api/inputs/set_input_subcategories.py +0 -0
  185. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/types/api/inputs/set_intermediate_type.py +0 -0
  186. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/types/api/material_families/__init__.py +0 -0
  187. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/types/api/material_families/update_entity_material_families.py +0 -0
  188. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/types/api/outputs/__init__.py +0 -0
  189. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/types/api/outputs/get_output_data.py +0 -0
  190. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/types/api/outputs/get_output_names.py +0 -0
  191. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/types/api/outputs/resolve_output_conditions.py +0 -0
  192. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/types/api/permissions/__init__.py +0 -0
  193. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/types/api/permissions/set_core_permissions.py +0 -0
  194. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/types/api/project/__init__.py +0 -0
  195. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/types/api/project/get_projects.py +0 -0
  196. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/types/api/project/get_projects_data.py +0 -0
  197. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/types/api/recipe_links/__init__.py +0 -0
  198. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/types/api/recipe_links/create_recipe_link.py +0 -0
  199. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/types/api/recipe_links/remove_recipe_link.py +0 -0
  200. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/types/api/recipe_metadata/__init__.py +0 -0
  201. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/types/api/recipe_metadata/get_recipe_metadata_data.py +0 -0
  202. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/types/api/recipes/__init__.py +0 -0
  203. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/types/api/recipes/add_recipe_to_project.py +0 -0
  204. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/types/api/recipes/archive_recipes.py +0 -0
  205. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/types/api/recipes/associate_recipe_as_input.py +0 -0
  206. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/types/api/recipes/associate_recipe_as_lot.py +0 -0
  207. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/types/api/recipes/clear_recipe_outputs.py +0 -0
  208. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/types/api/recipes/create_recipe.py +0 -0
  209. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/types/api/recipes/create_recipes.py +0 -0
  210. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/types/api/recipes/disassociate_recipe_as_input.py +0 -0
  211. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/types/api/recipes/edit_recipe_inputs.py +0 -0
  212. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/types/api/recipes/get_curve.py +0 -0
  213. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/types/api/recipes/get_recipe_calculations.py +0 -0
  214. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/types/api/recipes/get_recipe_links.py +0 -0
  215. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/types/api/recipes/get_recipe_names.py +0 -0
  216. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/types/api/recipes/get_recipe_output_metadata.py +0 -0
  217. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/types/api/recipes/get_recipes_data.py +0 -0
  218. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/types/api/recipes/lock_recipes.py +0 -0
  219. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/types/api/recipes/remove_recipe_from_project.py +0 -0
  220. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/types/api/recipes/set_recipe_inputs.py +0 -0
  221. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/types/api/recipes/set_recipe_metadata.py +0 -0
  222. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/types/api/recipes/set_recipe_output_annotations.py +0 -0
  223. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/types/api/recipes/set_recipe_output_file.py +0 -0
  224. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/types/api/recipes/set_recipe_outputs.py +0 -0
  225. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/types/api/recipes/set_recipe_tags.py +0 -0
  226. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/types/api/recipes/unarchive_recipes.py +0 -0
  227. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/types/api/recipes/unlock_recipes.py +0 -0
  228. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/types/api/triggers/__init__.py +0 -0
  229. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/types/api/triggers/run_trigger.py +0 -0
  230. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/types/api/uploader/__init__.py +0 -0
  231. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/types/api/uploader/invoke_uploader.py +0 -0
  232. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/types/async_batch.py +0 -0
  233. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/types/base.py +0 -0
  234. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/types/base_t.py +0 -0
  235. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/types/calculations.py +0 -0
  236. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/types/calculations_t.py +0 -0
  237. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/types/chemical_structure.py +0 -0
  238. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/types/chemical_structure_t.py +0 -0
  239. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/types/client_config.py +0 -0
  240. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/types/client_config_t.py +0 -0
  241. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/types/curves.py +0 -0
  242. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/types/curves_t.py +0 -0
  243. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/types/experiment_groups.py +0 -0
  244. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/types/experiment_groups_t.py +0 -0
  245. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/types/field_values.py +0 -0
  246. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/types/field_values_t.py +0 -0
  247. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/types/fields.py +0 -0
  248. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/types/fields_t.py +0 -0
  249. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/types/generic_upload.py +0 -0
  250. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/types/generic_upload_t.py +0 -0
  251. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/types/id_source.py +0 -0
  252. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/types/id_source_t.py +0 -0
  253. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/types/identifier.py +0 -0
  254. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/types/identifier_t.py +0 -0
  255. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/types/input_attributes.py +0 -0
  256. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/types/input_attributes_t.py +0 -0
  257. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/types/inputs.py +0 -0
  258. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/types/inputs_t.py +0 -0
  259. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/types/outputs.py +0 -0
  260. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/types/outputs_t.py +0 -0
  261. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/types/overrides.py +0 -0
  262. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/types/overrides_t.py +0 -0
  263. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/types/permissions.py +0 -0
  264. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/types/permissions_t.py +0 -0
  265. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/types/phases.py +0 -0
  266. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/types/phases_t.py +0 -0
  267. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/types/post_base.py +0 -0
  268. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/types/post_base_t.py +0 -0
  269. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/types/queued_job.py +0 -0
  270. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/types/queued_job_t.py +0 -0
  271. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/types/recipe_identifiers.py +0 -0
  272. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/types/recipe_identifiers_t.py +0 -0
  273. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/types/recipe_inputs.py +0 -0
  274. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/types/recipe_inputs_t.py +0 -0
  275. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/types/recipe_links.py +0 -0
  276. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/types/recipe_links_t.py +0 -0
  277. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/types/recipe_metadata.py +0 -0
  278. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/types/recipe_metadata_t.py +0 -0
  279. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/types/recipe_output_metadata.py +0 -0
  280. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/types/recipe_output_metadata_t.py +0 -0
  281. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/types/recipe_tags.py +0 -0
  282. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/types/recipe_tags_t.py +0 -0
  283. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/types/recipe_workflow_steps.py +0 -0
  284. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/types/recipe_workflow_steps_t.py +0 -0
  285. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/types/recipes.py +0 -0
  286. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/types/recipes_t.py +0 -0
  287. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/types/response.py +0 -0
  288. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/types/response_t.py +0 -0
  289. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/types/secret_retrieval.py +0 -0
  290. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/types/secret_retrieval_t.py +0 -0
  291. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/types/units.py +0 -0
  292. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/types/units_t.py +0 -0
  293. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/types/users.py +0 -0
  294. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/types/users_t.py +0 -0
  295. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/types/webhook_job.py +0 -0
  296. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/types/webhook_job_t.py +0 -0
  297. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/uncountable/types/workflows.py +0 -0
  298. {uncountablepythonsdk-0.0.75 → uncountablepythonsdk-0.0.76}/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.75
3
+ Version: 0.0.76
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
@@ -16,7 +16,7 @@ Classifier: Topic :: Utilities
16
16
  Classifier: Typing :: Typed
17
17
  Requires-Python: >=3.11
18
18
  Description-Content-Type: text/markdown
19
- Requires-Dist: aiotus==0.*
19
+ Requires-Dist: aiotus==1.*
20
20
  Requires-Dist: aiohttp==3.*
21
21
  Requires-Dist: requests==2.*
22
22
  Requires-Dist: SQLAlchemy>=1.4.0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: UncountablePythonSDK
3
- Version: 0.0.75
3
+ Version: 0.0.76
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
@@ -16,7 +16,7 @@ Classifier: Topic :: Utilities
16
16
  Classifier: Typing :: Typed
17
17
  Requires-Python: >=3.11
18
18
  Description-Content-Type: text/markdown
19
- Requires-Dist: aiotus==0.*
19
+ Requires-Dist: aiotus==1.*
20
20
  Requires-Dist: aiohttp==3.*
21
21
  Requires-Dist: requests==2.*
22
22
  Requires-Dist: SQLAlchemy>=1.4.0
@@ -136,6 +136,8 @@ uncountable/types/__init__.py
136
136
  uncountable/types/async_batch.py
137
137
  uncountable/types/async_batch_processor.py
138
138
  uncountable/types/async_batch_t.py
139
+ uncountable/types/auth_retrieval.py
140
+ uncountable/types/auth_retrieval_t.py
139
141
  uncountable/types/base.py
140
142
  uncountable/types/base_t.py
141
143
  uncountable/types/calculations.py
@@ -165,6 +167,8 @@ uncountable/types/input_attributes.py
165
167
  uncountable/types/input_attributes_t.py
166
168
  uncountable/types/inputs.py
167
169
  uncountable/types/inputs_t.py
170
+ uncountable/types/integration_server.py
171
+ uncountable/types/integration_server_t.py
168
172
  uncountable/types/job_definition.py
169
173
  uncountable/types/job_definition_t.py
170
174
  uncountable/types/outputs.py
@@ -217,6 +221,7 @@ uncountable/types/api/entity/__init__.py
217
221
  uncountable/types/api/entity/create_entities.py
218
222
  uncountable/types/api/entity/create_entity.py
219
223
  uncountable/types/api/entity/get_entities_data.py
224
+ uncountable/types/api/entity/grant_entity_permissions.py
220
225
  uncountable/types/api/entity/list_entities.py
221
226
  uncountable/types/api/entity/lock_entity.py
222
227
  uncountable/types/api/entity/resolve_entity_ids.py
@@ -267,6 +272,7 @@ uncountable/types/api/recipes/create_recipe.py
267
272
  uncountable/types/api/recipes/create_recipes.py
268
273
  uncountable/types/api/recipes/disassociate_recipe_as_input.py
269
274
  uncountable/types/api/recipes/edit_recipe_inputs.py
275
+ uncountable/types/api/recipes/get_column_calculation_values.py
270
276
  uncountable/types/api/recipes/get_curve.py
271
277
  uncountable/types/api/recipes/get_recipe_calculations.py
272
278
  uncountable/types/api/recipes/get_recipe_links.py
@@ -1,4 +1,4 @@
1
- aiotus==0.*
1
+ aiotus==1.*
2
2
  aiohttp==3.*
3
3
  requests==2.*
4
4
  SQLAlchemy>=1.4.0
@@ -2,6 +2,6 @@ furo==2024.8.6
2
2
  myst-parser==4.0.0
3
3
  sphinx-autoapi==3.3.0
4
4
  sphinx-copybutton==0.5.2
5
- Sphinx==8.0.0
5
+ Sphinx==8.1.3
6
6
  sphinx_design==0.6.1
7
7
  sphinx-favicon==1.0.1
@@ -1,3 +1,4 @@
1
+ import os
1
2
  from decimal import Decimal
2
3
 
3
4
  from uncountable.core import AsyncBatchProcessor, AuthDetailsApiKey, Client
@@ -11,10 +12,9 @@ from uncountable.types.recipe_identifiers import (
11
12
  )
12
13
 
13
14
  client = Client(
14
- base_url="https://app.uncountable.com",
15
+ base_url=os.environ["UNC_BASE_URL"],
15
16
  auth_details=AuthDetailsApiKey(
16
- api_id="X",
17
- api_secret_key="X",
17
+ api_id=os.environ["UNC_API_ID"], api_secret_key=os.environ["UNC_API_SECRET_KEY"]
18
18
  ),
19
19
  )
20
20
  batch_loader = AsyncBatchProcessor(client=client)
@@ -103,6 +103,9 @@ def _get_merged_serial_class_data(type_class: type[Any]) -> _SerialClassData | N
103
103
  if hasattr(type_class, "__unc_serial_data")
104
104
  else None
105
105
  )
106
+ if base_class_data is None:
107
+ return None
108
+
106
109
  if type_class.__bases__ is not None:
107
110
  for base in type_class.__bases__:
108
111
  curr_base_class_data = _get_merged_serial_class_data(base)
@@ -535,13 +535,8 @@ class SpecTypeDefnObject(SpecTypeDefn):
535
535
  base_type: list[SpecType] = [self.base] if self.base is not None else []
536
536
  return base_type + prop_types
537
537
 
538
- def get_generic(self) -> Optional[str]:
539
- if len(self.parameters) > 0:
540
- assert (
541
- len(self.parameters) == 1
542
- ), "Only single generic parameters current supported"
543
- return self.parameters[0]
544
- return None
538
+ def get_generics(self) -> list[str]:
539
+ return self.parameters
545
540
 
546
541
 
547
542
  class SpecTypeDefnAlias(SpecTypeDefn):
@@ -1134,7 +1129,11 @@ class SpecNamespace:
1134
1129
  spec_type = SpecTypeDefnStringEnum(self, name)
1135
1130
  else:
1136
1131
  parameters = (
1137
- [parameter.name for parameter in parsed_name.parameters[0]]
1132
+ [
1133
+ parameter.name
1134
+ for name_parameters in parsed_name.parameters
1135
+ for parameter in name_parameters
1136
+ ]
1138
1137
  if parsed_name.parameters is not None
1139
1138
  else None
1140
1139
  )
@@ -814,11 +814,11 @@ def _emit_type(ctx: Context, stype: builder.SpecType) -> None:
814
814
 
815
815
  class_out = io.StringIO()
816
816
  base_class = ""
817
- generic = stype.get_generic()
817
+ generics = stype.get_generics()
818
818
  if not stype.base.is_base:
819
819
  base_class = f"({refer_to(ctx, stype.base)})"
820
- elif generic is not None:
821
- base_class = f"(typing.Generic[{generic}])"
820
+ elif len(generics) > 0:
821
+ base_class = f"(typing.Generic[{", ".join(generics)}])"
822
822
  class_out.write(f"class {stype.name}{base_class}:\n")
823
823
 
824
824
  emitted_properties_metadata = _emit_type_properties(
@@ -829,7 +829,7 @@ def _emit_type(ctx: Context, stype: builder.SpecType) -> None:
829
829
  to_string_values = emitted_properties_metadata.to_string_values
830
830
  parse_require = emitted_properties_metadata.parse_require
831
831
 
832
- _emit_generic(ctx, stype.get_generic())
832
+ _emit_generics(ctx, generics)
833
833
 
834
834
  # Emit serial_class decorator
835
835
  ctx.out.write("@serial_class(\n")
@@ -864,8 +864,8 @@ def _emit_type(ctx: Context, stype: builder.SpecType) -> None:
864
864
  ctx.out.write(class_out.getvalue())
865
865
 
866
866
 
867
- def _emit_generic(ctx: Context, generic: Optional[str]) -> None:
868
- if generic is not None:
867
+ def _emit_generics(ctx: Context, generics: list[str]) -> None:
868
+ for generic in generics:
869
869
  ctx.out.write(f'{generic} = typing.TypeVar("{generic}")\n')
870
870
  ctx.out.write(f"{LINE_BREAK}{LINE_BREAK}")
871
871
 
@@ -49,7 +49,7 @@ keywords = [ "uncountable", "sdk", "api", "uncountable-sdk" ]
49
49
  requires-python = ">=3.11"
50
50
  # May be compatible with older versions
51
51
  dependencies = [
52
- "aiotus == 0.*",
52
+ "aiotus ==1.*",
53
53
  "aiohttp == 3.*",
54
54
  "requests == 2.*",
55
55
  "SQLAlchemy >= 1.4.0",
@@ -2,6 +2,8 @@ import functools
2
2
  import os
3
3
  from importlib.metadata import PackageNotFoundError, version
4
4
 
5
+ from uncountable.types import integration_server_t
6
+
5
7
 
6
8
  @functools.cache
7
9
  def get_version() -> str:
@@ -12,8 +14,8 @@ def get_version() -> str:
12
14
  return version_str
13
15
 
14
16
 
15
- def get_integration_env() -> str | None:
16
- return os.environ.get("UNC_INTEGRATION_ENV")
17
+ def get_server_env() -> str | None:
18
+ return os.environ.get("UNC_SERVER_ENV")
17
19
 
18
20
 
19
21
  def get_webhook_server_port() -> int:
@@ -26,3 +28,14 @@ def get_local_admin_server_port() -> int:
26
28
 
27
29
  def get_otel_enabled() -> bool:
28
30
  return os.environ.get("UNC_OTEL_ENABLED") == "true"
31
+
32
+
33
+ def get_profiles_module() -> str:
34
+ return os.environ["UNC_PROFILES_MODULE"]
35
+
36
+
37
+ def get_integration_envs() -> list[integration_server_t.IntegrationEnvironment]:
38
+ return [
39
+ integration_server_t.IntegrationEnvironment(env)
40
+ for env in os.environ.get("UNC_INTEGRATION_ENVS", "prod").split(",")
41
+ ]
@@ -3,22 +3,21 @@ from uncountable.core.client import ClientConfig
3
3
  from uncountable.core.types import AuthDetailsAll, AuthDetailsOAuth
4
4
  from uncountable.integration.secret_retrieval.retrieve_secret import retrieve_secret
5
5
  from uncountable.integration.telemetry import JobLogger
6
+ from uncountable.types import auth_retrieval_t
6
7
  from uncountable.types.job_definition_t import (
7
- AuthRetrievalBasic,
8
- AuthRetrievalOAuth,
9
8
  ProfileMetadata,
10
9
  )
11
10
 
12
11
 
13
12
  def _construct_auth_details(profile_meta: ProfileMetadata) -> AuthDetailsAll:
14
13
  match profile_meta.auth_retrieval:
15
- case AuthRetrievalOAuth():
14
+ case auth_retrieval_t.AuthRetrievalOAuth():
16
15
  refresh_token = retrieve_secret(
17
16
  profile_meta.auth_retrieval.refresh_token_secret,
18
17
  profile_metadata=profile_meta,
19
18
  )
20
19
  return AuthDetailsOAuth(refresh_token=refresh_token)
21
- case AuthRetrievalBasic():
20
+ case auth_retrieval_t.AuthRetrievalBasic():
22
21
  api_id = retrieve_secret(
23
22
  profile_meta.auth_retrieval.api_id_secret, profile_metadata=profile_meta
24
23
  )
@@ -55,7 +55,7 @@ def _start_workers(
55
55
  job_worker_lookup: dict[str, Worker] = {}
56
56
  job_definition_lookup: dict[str, job_definition_t.JobDefinition] = {}
57
57
  for profile in profiles:
58
- for job_definition in profile.definition.jobs:
58
+ for job_definition in profile.jobs:
59
59
  job_definition_lookup[job_definition.id] = job_definition
60
60
  job_worker_key = _get_job_worker_key(job_definition, profile.name)
61
61
  if job_worker_key not in job_queue_worker_lookup:
@@ -51,16 +51,11 @@ class RegisteredJobDetails:
51
51
 
52
52
  def get_registered_job_details(job_ref_name: str) -> RegisteredJobDetails:
53
53
  profiles = load_profiles()
54
- for profile in profiles:
55
- for job_definition in profile.definition.jobs:
54
+ for profile_metadata in profiles:
55
+ for job_definition in profile_metadata.jobs:
56
56
  if job_definition.id == job_ref_name:
57
57
  return RegisteredJobDetails(
58
- profile_metadata=job_definition_t.ProfileMetadata(
59
- name=profile.name,
60
- base_url=profile.definition.base_url,
61
- auth_retrieval=profile.definition.auth_retrieval,
62
- client_options=profile.definition.client_options,
63
- ),
58
+ profile_metadata=profile_metadata,
64
59
  job_definition=job_definition,
65
60
  )
66
61
  raise Exception(f"profile not found for job {job_ref_name}")
@@ -0,0 +1,67 @@
1
+ import functools
2
+ from importlib import resources
3
+
4
+ from pkgs.argument_parser import CachedParser
5
+ from uncountable.core import environment
6
+ from uncountable.types import integration_server_t, job_definition_t
7
+
8
+ profile_parser = CachedParser(job_definition_t.ProfileDefinition)
9
+
10
+ _DEFAULT_PROFILE_ENV = integration_server_t.IntegrationEnvironment.PROD
11
+ _IGNORED_PROFILE_FOLDERS = ["__pycache__"]
12
+
13
+
14
+ @functools.cache
15
+ def load_profiles() -> list[job_definition_t.ProfileMetadata]:
16
+ profiles_module = environment.get_profiles_module()
17
+ integration_envs = environment.get_integration_envs()
18
+ profiles = [
19
+ entry
20
+ for entry in resources.files(profiles_module).iterdir()
21
+ if entry.is_dir() and entry.name not in _IGNORED_PROFILE_FOLDERS
22
+ ]
23
+ profile_details: list[job_definition_t.ProfileMetadata] = []
24
+ seen_job_ids: set[str] = set()
25
+ for profile_file in profiles:
26
+ profile_name = profile_file.name
27
+ try:
28
+ definition = profile_parser.parse_yaml_resource(
29
+ package=".".join([profiles_module, profile_name]),
30
+ resource="profile.yaml",
31
+ )
32
+ for job in definition.jobs:
33
+ if job.id in seen_job_ids:
34
+ raise Exception(f"multiple jobs with id {job.id}")
35
+ seen_job_ids.add(job.id)
36
+
37
+ if definition.environments is not None:
38
+ for integration_env in integration_envs:
39
+ environment_config = definition.environments.get(integration_env)
40
+ if environment_config is not None:
41
+ profile_details.append(
42
+ job_definition_t.ProfileMetadata(
43
+ name=profile_name,
44
+ jobs=definition.jobs,
45
+ base_url=environment_config.base_url,
46
+ auth_retrieval=environment_config.auth_retrieval,
47
+ client_options=environment_config.client_options,
48
+ )
49
+ )
50
+ elif _DEFAULT_PROFILE_ENV in integration_envs:
51
+ assert (
52
+ definition.base_url is not None
53
+ and definition.auth_retrieval is not None
54
+ ), f"define environments in profile.yaml for {profile_name}"
55
+ profile_details.append(
56
+ job_definition_t.ProfileMetadata(
57
+ name=profile_name,
58
+ jobs=definition.jobs,
59
+ base_url=definition.base_url,
60
+ auth_retrieval=definition.auth_retrieval,
61
+ client_options=definition.client_options,
62
+ )
63
+ )
64
+ except FileNotFoundError as e:
65
+ print(f"WARN: profile.yaml not found for {profile_name}", e)
66
+ continue
67
+ return profile_details
@@ -12,12 +12,10 @@ from opentelemetry.trace import get_current_span
12
12
  from sqlalchemy.engine.base import Engine
13
13
 
14
14
  from uncountable.integration.cron import CronJobArgs, cron_job_executor
15
- from uncountable.integration.scan_profiles import ProfileDetails
16
15
  from uncountable.integration.telemetry import Logger
17
- from uncountable.types import base_t
16
+ from uncountable.types import base_t, job_definition_t
18
17
  from uncountable.types.job_definition_t import (
19
18
  CronJobDefinition,
20
- ProfileMetadata,
21
19
  WebhookJobDefinition,
22
20
  )
23
21
 
@@ -38,17 +36,11 @@ class IntegrationServer:
38
36
  )
39
37
  self._server_logger = Logger(get_current_span())
40
38
 
41
- def register_jobs(self, profiles: list[ProfileDetails]) -> None:
39
+ def register_jobs(self, profiles: list[job_definition_t.ProfileMetadata]) -> None:
42
40
  valid_job_ids = []
43
- for profile in profiles:
44
- for job_defn in profile.definition.jobs:
41
+ for profile_metadata in profiles:
42
+ for job_defn in profile_metadata.jobs:
45
43
  valid_job_ids.append(job_defn.id)
46
- profile_metadata = ProfileMetadata(
47
- name=profile.name,
48
- auth_retrieval=profile.definition.auth_retrieval,
49
- base_url=profile.definition.base_url,
50
- client_options=profile.definition.client_options,
51
- )
52
44
  match job_defn:
53
45
  case CronJobDefinition():
54
46
  # Add to ap scheduler
@@ -21,8 +21,8 @@ from opentelemetry.sdk.trace.export import (
21
21
  from opentelemetry.trace import DEFAULT_TRACE_OPTIONS, Span, Tracer
22
22
 
23
23
  from uncountable.core.environment import (
24
- get_integration_env,
25
24
  get_otel_enabled,
25
+ get_server_env,
26
26
  get_version,
27
27
  )
28
28
  from uncountable.types import base_t, job_definition_t
@@ -41,7 +41,7 @@ def get_otel_resource() -> Resource:
41
41
  unc_version = os.environ.get("UNC_VERSION")
42
42
  if unc_version is not None:
43
43
  attributes["service.version"] = unc_version
44
- unc_env = get_integration_env()
44
+ unc_env = get_server_env()
45
45
  if unc_env is not None:
46
46
  attributes["deployment.environment"] = unc_env
47
47
  resource = Resource.create(attributes=_cast_attributes(attributes))
@@ -8,8 +8,8 @@ from flask.typing import ResponseReturnValue
8
8
  from flask.wrappers import Response
9
9
  from opentelemetry.trace import get_current_span
10
10
  from uncountable.core.environment import (
11
- get_integration_env,
12
11
  get_local_admin_server_port,
12
+ get_server_env,
13
13
  get_webhook_server_port,
14
14
  )
15
15
  from uncountable.integration.queue_runner.command_server.command_client import (
@@ -143,15 +143,9 @@ def register_route(
143
143
 
144
144
  def main() -> None:
145
145
  profiles = load_profiles()
146
- for profile in profiles:
146
+ for profile_metadata in profiles:
147
147
  server_logger = Logger(get_current_span())
148
- profile_metadata = job_definition_t.ProfileMetadata(
149
- name=profile.name,
150
- auth_retrieval=profile.definition.auth_retrieval,
151
- base_url=profile.definition.base_url,
152
- client_options=profile.definition.client_options,
153
- )
154
- for job in profile.definition.jobs:
148
+ for job in profile_metadata.jobs:
155
149
  if isinstance(job, job_definition_t.WebhookJobDefinition):
156
150
  register_route(
157
151
  server_logger=server_logger, profile_meta=profile_metadata, job=job
@@ -165,6 +159,6 @@ if __name__ == "__main__":
165
159
  app.run(
166
160
  host="0.0.0.0",
167
161
  port=get_webhook_server_port(),
168
- debug=get_integration_env() == "playground",
162
+ debug=get_server_env() == "playground",
169
163
  exclude_patterns=[],
170
164
  )
@@ -9,6 +9,7 @@ from .api.equipment import associate_equipment_input as associate_equipment_inpu
9
9
  from .api.recipes import associate_recipe_as_input as associate_recipe_as_input_t
10
10
  from .api.recipes import associate_recipe_as_lot as associate_recipe_as_lot_t
11
11
  from . import async_batch_t as async_batch_t
12
+ from . import auth_retrieval_t as auth_retrieval_t
12
13
  from . import base_t as base_t
13
14
  from . import calculations_t as calculations_t
14
15
  from . import chemical_structure_t as chemical_structure_t
@@ -31,6 +32,7 @@ from . import experiment_groups_t as experiment_groups_t
31
32
  from . import field_values_t as field_values_t
32
33
  from . import fields_t as fields_t
33
34
  from . import generic_upload_t as generic_upload_t
35
+ from .api.recipes import get_column_calculation_values as get_column_calculation_values_t
34
36
  from .api.recipes import get_curve as get_curve_t
35
37
  from .api.entity import get_entities_data as get_entities_data_t
36
38
  from .api.inputs import get_input_data as get_input_data_t
@@ -47,10 +49,12 @@ from .api.recipe_metadata import get_recipe_metadata_data as get_recipe_metadata
47
49
  from .api.recipes import get_recipe_names as get_recipe_names_t
48
50
  from .api.recipes import get_recipe_output_metadata as get_recipe_output_metadata_t
49
51
  from .api.recipes import get_recipes_data as get_recipes_data_t
52
+ from .api.entity import grant_entity_permissions as grant_entity_permissions_t
50
53
  from . import id_source_t as id_source_t
51
54
  from . import identifier_t as identifier_t
52
55
  from . import input_attributes_t as input_attributes_t
53
56
  from . import inputs_t as inputs_t
57
+ from . import integration_server_t as integration_server_t
54
58
  from .api.uploader import invoke_uploader as invoke_uploader_t
55
59
  from . import job_definition_t as job_definition_t
56
60
  from .api.entity import list_entities as list_entities_t
@@ -110,6 +114,7 @@ __all__: list[str] = [
110
114
  "associate_recipe_as_input_t",
111
115
  "associate_recipe_as_lot_t",
112
116
  "async_batch_t",
117
+ "auth_retrieval_t",
113
118
  "base_t",
114
119
  "calculations_t",
115
120
  "chemical_structure_t",
@@ -132,6 +137,7 @@ __all__: list[str] = [
132
137
  "field_values_t",
133
138
  "fields_t",
134
139
  "generic_upload_t",
140
+ "get_column_calculation_values_t",
135
141
  "get_curve_t",
136
142
  "get_entities_data_t",
137
143
  "get_input_data_t",
@@ -148,10 +154,12 @@ __all__: list[str] = [
148
154
  "get_recipe_names_t",
149
155
  "get_recipe_output_metadata_t",
150
156
  "get_recipes_data_t",
157
+ "grant_entity_permissions_t",
151
158
  "id_source_t",
152
159
  "identifier_t",
153
160
  "input_attributes_t",
154
161
  "inputs_t",
162
+ "integration_server_t",
155
163
  "invoke_uploader_t",
156
164
  "job_definition_t",
157
165
  "list_entities_t",
@@ -12,6 +12,7 @@ from pkgs.serialization import serial_class
12
12
  from ... import base_t
13
13
  from ... import entity_t
14
14
  from ... import field_values_t
15
+ from ... import identifier_t
15
16
 
16
17
  __all__: list[str] = [
17
18
  "Arguments",
@@ -40,9 +41,10 @@ class EntityToCreate:
40
41
  )
41
42
  @dataclasses.dataclass(kw_only=True)
42
43
  class Arguments:
43
- definition_id: base_t.ObjectId
44
- entity_type: typing.Union[typing.Literal[entity_t.EntityType.LAB_REQUEST], typing.Literal[entity_t.EntityType.APPROVAL], typing.Literal[entity_t.EntityType.CUSTOM_ENTITY], typing.Literal[entity_t.EntityType.INVENTORY_AMOUNT], typing.Literal[entity_t.EntityType.TASK], typing.Literal[entity_t.EntityType.PROJECT], typing.Literal[entity_t.EntityType.EQUIPMENT], typing.Literal[entity_t.EntityType.INV_LOCAL_LOCATIONS], typing.Literal[entity_t.EntityType.FIELD_OPTION_SET], typing.Literal[entity_t.EntityType.WEBHOOK], typing.Literal[entity_t.EntityType.SPECS], typing.Literal[entity_t.EntityType.GOAL], typing.Literal[entity_t.EntityType.INGREDIENT_TAG_MAP], typing.Literal[entity_t.EntityType.INGREDIENT_TAG], typing.Literal[entity_t.EntityType.CONDITION_PARAMETER], typing.Literal[entity_t.EntityType.OUTPUT]]
44
+ entity_type: entity_t.LimitedEntityType
45
45
  entities_to_create: list[EntityToCreate]
46
+ definition_id: typing.Optional[base_t.ObjectId] = None
47
+ definition_key: typing.Optional[identifier_t.IdentifierKey] = None
46
48
 
47
49
 
48
50
  # DO NOT MODIFY -- This file is generated by type_spec
@@ -12,6 +12,7 @@ from pkgs.serialization import serial_class
12
12
  from ... import base_t
13
13
  from ... import entity_t
14
14
  from ... import field_values_t
15
+ from ... import identifier_t
15
16
 
16
17
  __all__: list[str] = [
17
18
  "Arguments",
@@ -43,8 +44,9 @@ class EntityFieldInitialValue:
43
44
  )
44
45
  @dataclasses.dataclass(kw_only=True)
45
46
  class Arguments:
46
- definition_id: base_t.ObjectId
47
- entity_type: typing.Union[typing.Literal[entity_t.EntityType.LAB_REQUEST], typing.Literal[entity_t.EntityType.APPROVAL], typing.Literal[entity_t.EntityType.CUSTOM_ENTITY], typing.Literal[entity_t.EntityType.INVENTORY_AMOUNT], typing.Literal[entity_t.EntityType.TASK], typing.Literal[entity_t.EntityType.PROJECT], typing.Literal[entity_t.EntityType.EQUIPMENT], typing.Literal[entity_t.EntityType.INV_LOCAL_LOCATIONS], typing.Literal[entity_t.EntityType.FIELD_OPTION_SET], typing.Literal[entity_t.EntityType.WEBHOOK], typing.Literal[entity_t.EntityType.SPECS], typing.Literal[entity_t.EntityType.GOAL], typing.Literal[entity_t.EntityType.INGREDIENT_TAG_MAP], typing.Literal[entity_t.EntityType.INGREDIENT_TAG], typing.Literal[entity_t.EntityType.CONDITION_PARAMETER], typing.Literal[entity_t.EntityType.OUTPUT]]
47
+ entity_type: entity_t.LimitedEntityType
48
+ definition_id: typing.Optional[base_t.ObjectId] = None
49
+ definition_key: typing.Optional[identifier_t.IdentifierKey] = None
48
50
  field_values: typing.Optional[typing.Optional[list[field_values_t.FieldRefNameValue]]] = None
49
51
 
50
52
 
@@ -0,0 +1,48 @@
1
+ # DO NOT MODIFY -- This file is generated by type_spec
2
+ # flake8: noqa: F821
3
+ # ruff: noqa: E402 Q003
4
+ # fmt: off
5
+ # isort: skip_file
6
+ from __future__ import annotations
7
+ import typing # noqa: F401
8
+ import datetime # noqa: F401
9
+ from decimal import Decimal # noqa: F401
10
+ import dataclasses
11
+ from pkgs.serialization import serial_class
12
+ from ... import async_batch_t
13
+ from ... import entity_t
14
+ from ... import identifier_t
15
+
16
+ __all__: list[str] = [
17
+ "Arguments",
18
+ "Data",
19
+ "ENDPOINT_METHOD",
20
+ "ENDPOINT_PATH",
21
+ ]
22
+
23
+ ENDPOINT_METHOD = "POST"
24
+ ENDPOINT_PATH = "api/external/entity/grant_entity_permissions"
25
+
26
+
27
+ # DO NOT MODIFY -- This file is generated by type_spec
28
+ @serial_class(
29
+ named_type_path="sdk.api.entity.grant_entity_permissions.Arguments",
30
+ )
31
+ @dataclasses.dataclass(kw_only=True)
32
+ class Arguments:
33
+ entity_type: entity_t.LimitedEntityType
34
+ entity_key: identifier_t.IdentifierKey
35
+ permission_types: list[entity_t.GrantableEntityPermissionType]
36
+ user_keys: typing.Optional[list[identifier_t.IdentifierKey]] = None
37
+ user_group_keys: typing.Optional[list[identifier_t.IdentifierKey]] = None
38
+ all_users: typing.Optional[bool] = None
39
+
40
+
41
+ # DO NOT MODIFY -- This file is generated by type_spec
42
+ @serial_class(
43
+ named_type_path="sdk.api.entity.grant_entity_permissions.Data",
44
+ )
45
+ @dataclasses.dataclass(kw_only=True)
46
+ class Data(async_batch_t.AsyncBatchActionReturn):
47
+ pass
48
+ # DO NOT MODIFY -- This file is generated by type_spec
@@ -0,0 +1,58 @@
1
+ # DO NOT MODIFY -- This file is generated by type_spec
2
+ # flake8: noqa: F821
3
+ # ruff: noqa: E402 Q003
4
+ # fmt: off
5
+ # isort: skip_file
6
+ from __future__ import annotations
7
+ import typing # noqa: F401
8
+ import datetime # noqa: F401
9
+ from decimal import Decimal # noqa: F401
10
+ import dataclasses
11
+ from pkgs.serialization import serial_class
12
+ from ... import base_t
13
+ from ... import identifier_t
14
+
15
+ __all__: list[str] = [
16
+ "Arguments",
17
+ "Data",
18
+ "ENDPOINT_METHOD",
19
+ "ENDPOINT_PATH",
20
+ "RecipeColumnCalculationValue",
21
+ ]
22
+
23
+ ENDPOINT_METHOD = "GET"
24
+ ENDPOINT_PATH = "api/external/recipes/get_column_calculation_values"
25
+
26
+
27
+ # DO NOT MODIFY -- This file is generated by type_spec
28
+ @serial_class(
29
+ named_type_path="sdk.api.recipes.get_column_calculation_values.Arguments",
30
+ )
31
+ @dataclasses.dataclass(kw_only=True)
32
+ class Arguments:
33
+ recipe_keys: list[identifier_t.IdentifierKey]
34
+ calculation_key: identifier_t.IdentifierKey
35
+
36
+
37
+ # DO NOT MODIFY -- This file is generated by type_spec
38
+ @serial_class(
39
+ named_type_path="sdk.api.recipes.get_column_calculation_values.RecipeColumnCalculationValue",
40
+ to_string_values={"calculation_quantity"},
41
+ )
42
+ @dataclasses.dataclass(kw_only=True)
43
+ class RecipeColumnCalculationValue:
44
+ recipe_id: base_t.ObjectId
45
+ ingredient_id: base_t.ObjectId
46
+ recipe_step_id: base_t.ObjectId
47
+ recipe_input_id: base_t.ObjectId
48
+ calculation_quantity: typing.Optional[Decimal] = None
49
+
50
+
51
+ # DO NOT MODIFY -- This file is generated by type_spec
52
+ @serial_class(
53
+ named_type_path="sdk.api.recipes.get_column_calculation_values.Data",
54
+ )
55
+ @dataclasses.dataclass(kw_only=True)
56
+ class Data:
57
+ values: list[RecipeColumnCalculationValue]
58
+ # DO NOT MODIFY -- This file is generated by type_spec