UncountablePythonSDK 0.0.79__tar.gz → 0.0.81__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 (302) hide show
  1. {uncountablepythonsdk-0.0.79/UncountablePythonSDK.egg-info → uncountablepythonsdk-0.0.81}/PKG-INFO +1 -1
  2. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81/UncountablePythonSDK.egg-info}/PKG-INFO +1 -1
  3. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/UncountablePythonSDK.egg-info/SOURCES.txt +1 -0
  4. uncountablepythonsdk-0.0.81/examples/integration-server/jobs/materials_auto/example_wh.py +15 -0
  5. uncountablepythonsdk-0.0.81/examples/integration-server/jobs/materials_auto/profile.yaml +43 -0
  6. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/pkgs/serialization/serial_class.py +4 -0
  7. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/pkgs/type_spec/parts/base.py.prepart +2 -2
  8. uncountablepythonsdk-0.0.81/uncountable/integration/executors/executors.py +137 -0
  9. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/integration/queue_runner/job_scheduler.py +41 -9
  10. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/integration/queue_runner/worker.py +3 -0
  11. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/types/base_t.py +2 -2
  12. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/types/entity_t.py +4 -0
  13. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/types/job_definition_t.py +2 -2
  14. uncountablepythonsdk-0.0.79/examples/integration-server/jobs/materials_auto/profile.yaml +0 -19
  15. uncountablepythonsdk-0.0.79/uncountable/integration/executors/executors.py +0 -56
  16. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/.github/workflows/documentation.yml +0 -0
  17. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/.github/workflows/publish.yml +0 -0
  18. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/.gitignore +0 -0
  19. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/README.md +0 -0
  20. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/UncountablePythonSDK.egg-info/dependency_links.txt +0 -0
  21. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/UncountablePythonSDK.egg-info/requires.txt +0 -0
  22. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/UncountablePythonSDK.egg-info/top_level.txt +0 -0
  23. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/docs/.gitignore +0 -0
  24. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/docs/conf.py +0 -0
  25. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/docs/index.md +0 -0
  26. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/docs/justfile +0 -0
  27. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/docs/quickstart.md +0 -0
  28. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/docs/requirements.txt +0 -0
  29. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/docs/static/favicons/android-chrome-192x192.png +0 -0
  30. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/docs/static/favicons/android-chrome-512x512.png +0 -0
  31. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/docs/static/favicons/apple-touch-icon.png +0 -0
  32. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/docs/static/favicons/browserconfig.xml +0 -0
  33. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/docs/static/favicons/favicon-16x16.png +0 -0
  34. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/docs/static/favicons/favicon-32x32.png +0 -0
  35. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/docs/static/favicons/manifest.json +0 -0
  36. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/docs/static/favicons/mstile-150x150.png +0 -0
  37. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/docs/static/favicons/safari-pinned-tab.svg +0 -0
  38. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/docs/static/logo_blue.png +0 -0
  39. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/examples/async_batch.py +0 -0
  40. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/examples/create_entity.py +0 -0
  41. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/examples/edit_recipe_inputs.py +0 -0
  42. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/examples/integration-server/jobs/materials_auto/example_cron.py +0 -0
  43. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/examples/integration-server/pyproject.toml +0 -0
  44. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/examples/invoke_uploader.py +0 -0
  45. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/examples/set_recipe_metadata_file.py +0 -0
  46. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/examples/set_recipe_output_file_sdk.py +0 -0
  47. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/examples/upload_files.py +0 -0
  48. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/pkgs/__init__.py +0 -0
  49. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/pkgs/argument_parser/__init__.py +0 -0
  50. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/pkgs/argument_parser/_is_enum.py +0 -0
  51. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/pkgs/argument_parser/_is_namedtuple.py +0 -0
  52. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/pkgs/argument_parser/argument_parser.py +0 -0
  53. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/pkgs/argument_parser/case_convert.py +0 -0
  54. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/pkgs/filesystem_utils/__init__.py +0 -0
  55. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/pkgs/filesystem_utils/_gdrive_session.py +0 -0
  56. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/pkgs/filesystem_utils/_local_session.py +0 -0
  57. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/pkgs/filesystem_utils/_s3_session.py +0 -0
  58. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/pkgs/filesystem_utils/_sftp_session.py +0 -0
  59. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/pkgs/filesystem_utils/file_type_utils.py +0 -0
  60. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/pkgs/filesystem_utils/filesystem_session.py +0 -0
  61. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/pkgs/py.typed +0 -0
  62. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/pkgs/serialization/__init__.py +0 -0
  63. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/pkgs/serialization/missing_sentry.py +0 -0
  64. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/pkgs/serialization/opaque_key.py +0 -0
  65. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/pkgs/serialization/serial_union.py +0 -0
  66. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/pkgs/serialization/yaml.py +0 -0
  67. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/pkgs/serialization_util/__init__.py +0 -0
  68. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/pkgs/serialization_util/_get_type_for_serialization.py +0 -0
  69. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/pkgs/serialization_util/convert_to_snakecase.py +0 -0
  70. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/pkgs/serialization_util/serialization_helpers.py +0 -0
  71. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/pkgs/strenum_compat/__init__.py +0 -0
  72. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/pkgs/strenum_compat/strenum_compat.py +0 -0
  73. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/pkgs/type_spec/__init__.py +0 -0
  74. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/pkgs/type_spec/__main__.py +0 -0
  75. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/pkgs/type_spec/actions_registry/__init__.py +0 -0
  76. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/pkgs/type_spec/actions_registry/__main__.py +0 -0
  77. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/pkgs/type_spec/actions_registry/emit_typescript.py +0 -0
  78. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/pkgs/type_spec/builder.py +0 -0
  79. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/pkgs/type_spec/config.py +0 -0
  80. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/pkgs/type_spec/emit_io_ts.py +0 -0
  81. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/pkgs/type_spec/emit_open_api.py +0 -0
  82. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/pkgs/type_spec/emit_open_api_util.py +0 -0
  83. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/pkgs/type_spec/emit_python.py +0 -0
  84. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/pkgs/type_spec/emit_typescript.py +0 -0
  85. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/pkgs/type_spec/emit_typescript_util.py +0 -0
  86. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/pkgs/type_spec/load_types.py +0 -0
  87. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/pkgs/type_spec/open_api_util.py +0 -0
  88. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/pkgs/type_spec/parts/base.ts.prepart +0 -0
  89. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/pkgs/type_spec/test.py +0 -0
  90. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/pkgs/type_spec/type_info/__main__.py +0 -0
  91. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/pkgs/type_spec/type_info/emit_type_info.py +0 -0
  92. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/pkgs/type_spec/util.py +0 -0
  93. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/pkgs/type_spec/value_spec/__init__.py +0 -0
  94. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/pkgs/type_spec/value_spec/__main__.py +0 -0
  95. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/pkgs/type_spec/value_spec/convert_type.py +0 -0
  96. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/pkgs/type_spec/value_spec/emit_python.py +0 -0
  97. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/pkgs/type_spec/value_spec/types.py +0 -0
  98. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/pyproject.toml +0 -0
  99. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/setup.cfg +0 -0
  100. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/__init__.py +0 -0
  101. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/core/__init__.py +0 -0
  102. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/core/async_batch.py +0 -0
  103. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/core/client.py +0 -0
  104. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/core/environment.py +0 -0
  105. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/core/file_upload.py +0 -0
  106. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/core/types.py +0 -0
  107. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/integration/__init__.py +0 -0
  108. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/integration/cli.py +0 -0
  109. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/integration/construct_client.py +0 -0
  110. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/integration/cron.py +0 -0
  111. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/integration/db/__init__.py +0 -0
  112. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/integration/db/connect.py +0 -0
  113. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/integration/db/session.py +0 -0
  114. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/integration/entrypoint.py +0 -0
  115. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/integration/executors/__init__.py +0 -0
  116. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/integration/executors/generic_upload_executor.py +0 -0
  117. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/integration/executors/script_executor.py +0 -0
  118. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/integration/job.py +0 -0
  119. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/integration/queue_runner/__init__.py +0 -0
  120. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/integration/queue_runner/command_server/__init__.py +0 -0
  121. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/integration/queue_runner/command_server/command_client.py +0 -0
  122. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/integration/queue_runner/command_server/command_server.py +0 -0
  123. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/integration/queue_runner/command_server/protocol/__init__.py +0 -0
  124. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/integration/queue_runner/command_server/protocol/command_server.proto +0 -0
  125. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/integration/queue_runner/command_server/protocol/command_server_pb2.py +0 -0
  126. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/integration/queue_runner/command_server/protocol/command_server_pb2.pyi +0 -0
  127. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/integration/queue_runner/command_server/protocol/command_server_pb2_grpc.py +0 -0
  128. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/integration/queue_runner/command_server/types.py +0 -0
  129. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/integration/queue_runner/datastore/__init__.py +0 -0
  130. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/integration/queue_runner/datastore/datastore_sqlite.py +0 -0
  131. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/integration/queue_runner/datastore/interface.py +0 -0
  132. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/integration/queue_runner/datastore/model.py +0 -0
  133. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/integration/queue_runner/queue_runner.py +0 -0
  134. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/integration/queue_runner/types.py +0 -0
  135. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/integration/scan_profiles.py +0 -0
  136. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/integration/scheduler.py +0 -0
  137. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/integration/secret_retrieval/__init__.py +0 -0
  138. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/integration/secret_retrieval/retrieve_secret.py +0 -0
  139. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/integration/server.py +0 -0
  140. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/integration/telemetry.py +0 -0
  141. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/integration/webhook_server/entrypoint.py +0 -0
  142. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/py.typed +0 -0
  143. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/types/__init__.py +0 -0
  144. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/types/api/__init__.py +0 -0
  145. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/types/api/batch/__init__.py +0 -0
  146. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/types/api/batch/execute_batch.py +0 -0
  147. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/types/api/batch/execute_batch_load_async.py +0 -0
  148. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/types/api/chemical/__init__.py +0 -0
  149. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/types/api/chemical/convert_chemical_formats.py +0 -0
  150. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/types/api/entity/__init__.py +0 -0
  151. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/types/api/entity/create_entities.py +0 -0
  152. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/types/api/entity/create_entity.py +0 -0
  153. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/types/api/entity/get_entities_data.py +0 -0
  154. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/types/api/entity/grant_entity_permissions.py +0 -0
  155. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/types/api/entity/list_entities.py +0 -0
  156. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/types/api/entity/lock_entity.py +0 -0
  157. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/types/api/entity/resolve_entity_ids.py +0 -0
  158. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/types/api/entity/set_values.py +0 -0
  159. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/types/api/entity/transition_entity_phase.py +0 -0
  160. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/types/api/entity/unlock_entity.py +0 -0
  161. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/types/api/equipment/__init__.py +0 -0
  162. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/types/api/equipment/associate_equipment_input.py +0 -0
  163. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/types/api/field_options/__init__.py +0 -0
  164. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/types/api/field_options/upsert_field_options.py +0 -0
  165. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/types/api/id_source/__init__.py +0 -0
  166. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/types/api/id_source/list_id_source.py +0 -0
  167. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/types/api/id_source/match_id_source.py +0 -0
  168. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/types/api/input_groups/__init__.py +0 -0
  169. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/types/api/input_groups/get_input_group_names.py +0 -0
  170. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/types/api/inputs/__init__.py +0 -0
  171. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/types/api/inputs/create_inputs.py +0 -0
  172. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/types/api/inputs/get_input_data.py +0 -0
  173. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/types/api/inputs/get_input_names.py +0 -0
  174. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/types/api/inputs/get_inputs_data.py +0 -0
  175. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/types/api/inputs/set_input_attribute_values.py +0 -0
  176. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/types/api/inputs/set_input_category.py +0 -0
  177. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/types/api/inputs/set_input_subcategories.py +0 -0
  178. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/types/api/inputs/set_intermediate_type.py +0 -0
  179. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/types/api/material_families/__init__.py +0 -0
  180. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/types/api/material_families/update_entity_material_families.py +0 -0
  181. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/types/api/outputs/__init__.py +0 -0
  182. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/types/api/outputs/get_output_data.py +0 -0
  183. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/types/api/outputs/get_output_names.py +0 -0
  184. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/types/api/outputs/resolve_output_conditions.py +0 -0
  185. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/types/api/permissions/__init__.py +0 -0
  186. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/types/api/permissions/set_core_permissions.py +0 -0
  187. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/types/api/project/__init__.py +0 -0
  188. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/types/api/project/get_projects.py +0 -0
  189. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/types/api/project/get_projects_data.py +0 -0
  190. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/types/api/recipe_links/__init__.py +0 -0
  191. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/types/api/recipe_links/create_recipe_link.py +0 -0
  192. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/types/api/recipe_links/remove_recipe_link.py +0 -0
  193. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/types/api/recipe_metadata/__init__.py +0 -0
  194. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/types/api/recipe_metadata/get_recipe_metadata_data.py +0 -0
  195. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/types/api/recipes/__init__.py +0 -0
  196. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/types/api/recipes/add_recipe_to_project.py +0 -0
  197. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/types/api/recipes/archive_recipes.py +0 -0
  198. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/types/api/recipes/associate_recipe_as_input.py +0 -0
  199. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/types/api/recipes/associate_recipe_as_lot.py +0 -0
  200. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/types/api/recipes/clear_recipe_outputs.py +0 -0
  201. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/types/api/recipes/create_recipe.py +0 -0
  202. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/types/api/recipes/create_recipes.py +0 -0
  203. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/types/api/recipes/disassociate_recipe_as_input.py +0 -0
  204. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/types/api/recipes/edit_recipe_inputs.py +0 -0
  205. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/types/api/recipes/get_column_calculation_values.py +0 -0
  206. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/types/api/recipes/get_curve.py +0 -0
  207. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/types/api/recipes/get_recipe_calculations.py +0 -0
  208. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/types/api/recipes/get_recipe_links.py +0 -0
  209. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/types/api/recipes/get_recipe_names.py +0 -0
  210. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/types/api/recipes/get_recipe_output_metadata.py +0 -0
  211. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/types/api/recipes/get_recipes_data.py +0 -0
  212. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/types/api/recipes/lock_recipes.py +0 -0
  213. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/types/api/recipes/remove_recipe_from_project.py +0 -0
  214. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/types/api/recipes/set_recipe_inputs.py +0 -0
  215. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/types/api/recipes/set_recipe_metadata.py +0 -0
  216. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/types/api/recipes/set_recipe_output_annotations.py +0 -0
  217. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/types/api/recipes/set_recipe_output_file.py +0 -0
  218. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/types/api/recipes/set_recipe_outputs.py +0 -0
  219. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/types/api/recipes/set_recipe_tags.py +0 -0
  220. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/types/api/recipes/unarchive_recipes.py +0 -0
  221. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/types/api/recipes/unlock_recipes.py +0 -0
  222. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/types/api/triggers/__init__.py +0 -0
  223. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/types/api/triggers/run_trigger.py +0 -0
  224. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/types/api/uploader/__init__.py +0 -0
  225. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/types/api/uploader/invoke_uploader.py +0 -0
  226. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/types/async_batch.py +0 -0
  227. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/types/async_batch_processor.py +0 -0
  228. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/types/async_batch_t.py +0 -0
  229. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/types/async_jobs.py +0 -0
  230. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/types/async_jobs_t.py +0 -0
  231. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/types/auth_retrieval.py +0 -0
  232. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/types/auth_retrieval_t.py +0 -0
  233. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/types/base.py +0 -0
  234. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/types/calculations.py +0 -0
  235. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/types/calculations_t.py +0 -0
  236. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/types/chemical_structure.py +0 -0
  237. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/types/chemical_structure_t.py +0 -0
  238. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/types/client_base.py +0 -0
  239. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/types/client_config.py +0 -0
  240. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/types/client_config_t.py +0 -0
  241. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/types/curves.py +0 -0
  242. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/types/curves_t.py +0 -0
  243. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/types/entity.py +0 -0
  244. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/types/experiment_groups.py +0 -0
  245. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/types/experiment_groups_t.py +0 -0
  246. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/types/field_values.py +0 -0
  247. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/types/field_values_t.py +0 -0
  248. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/types/fields.py +0 -0
  249. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/types/fields_t.py +0 -0
  250. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/types/generic_upload.py +0 -0
  251. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/types/generic_upload_t.py +0 -0
  252. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/types/id_source.py +0 -0
  253. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/types/id_source_t.py +0 -0
  254. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/types/identifier.py +0 -0
  255. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/types/identifier_t.py +0 -0
  256. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/types/input_attributes.py +0 -0
  257. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/types/input_attributes_t.py +0 -0
  258. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/types/inputs.py +0 -0
  259. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/types/inputs_t.py +0 -0
  260. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/types/integration_server.py +0 -0
  261. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/types/integration_server_t.py +0 -0
  262. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/types/job_definition.py +0 -0
  263. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/types/outputs.py +0 -0
  264. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/types/outputs_t.py +0 -0
  265. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/types/overrides.py +0 -0
  266. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/types/overrides_t.py +0 -0
  267. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/types/permissions.py +0 -0
  268. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/types/permissions_t.py +0 -0
  269. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/types/phases.py +0 -0
  270. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/types/phases_t.py +0 -0
  271. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/types/post_base.py +0 -0
  272. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/types/post_base_t.py +0 -0
  273. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/types/queued_job.py +0 -0
  274. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/types/queued_job_t.py +0 -0
  275. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/types/recipe_identifiers.py +0 -0
  276. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/types/recipe_identifiers_t.py +0 -0
  277. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/types/recipe_inputs.py +0 -0
  278. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/types/recipe_inputs_t.py +0 -0
  279. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/types/recipe_links.py +0 -0
  280. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/types/recipe_links_t.py +0 -0
  281. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/types/recipe_metadata.py +0 -0
  282. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/types/recipe_metadata_t.py +0 -0
  283. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/types/recipe_output_metadata.py +0 -0
  284. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/types/recipe_output_metadata_t.py +0 -0
  285. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/types/recipe_tags.py +0 -0
  286. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/types/recipe_tags_t.py +0 -0
  287. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/types/recipe_workflow_steps.py +0 -0
  288. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/types/recipe_workflow_steps_t.py +0 -0
  289. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/types/recipes.py +0 -0
  290. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/types/recipes_t.py +0 -0
  291. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/types/response.py +0 -0
  292. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/types/response_t.py +0 -0
  293. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/types/secret_retrieval.py +0 -0
  294. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/types/secret_retrieval_t.py +0 -0
  295. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/types/units.py +0 -0
  296. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/types/units_t.py +0 -0
  297. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/types/users.py +0 -0
  298. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/types/users_t.py +0 -0
  299. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/types/webhook_job.py +0 -0
  300. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/types/webhook_job_t.py +0 -0
  301. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/uncountable/types/workflows.py +0 -0
  302. {uncountablepythonsdk-0.0.79 → uncountablepythonsdk-0.0.81}/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.79
3
+ Version: 0.0.81
4
4
  Summary: Uncountable SDK
5
5
  Project-URL: Homepage, https://github.com/uncountableinc/uncountable-python-sdk
6
6
  Project-URL: Repository, https://github.com/uncountableinc/uncountable-python-sdk.git
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: UncountablePythonSDK
3
- Version: 0.0.79
3
+ Version: 0.0.81
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
@@ -33,6 +33,7 @@ examples/set_recipe_output_file_sdk.py
33
33
  examples/upload_files.py
34
34
  examples/integration-server/pyproject.toml
35
35
  examples/integration-server/jobs/materials_auto/example_cron.py
36
+ examples/integration-server/jobs/materials_auto/example_wh.py
36
37
  examples/integration-server/jobs/materials_auto/profile.yaml
37
38
  pkgs/__init__.py
38
39
  pkgs/py.typed
@@ -0,0 +1,15 @@
1
+ import typing
2
+
3
+ from uncountable.integration.job import JobArguments, WebhookJob, register_job
4
+ from uncountable.types.job_definition_t import JobResult
5
+
6
+
7
+ @register_job
8
+ class WebhookExample(WebhookJob):
9
+ @property
10
+ def payload_type(self) -> typing.Any:
11
+ return super().payload_type
12
+
13
+ def run(self, args: JobArguments, payload: typing.Any) -> JobResult:
14
+ args.logger.log_info(f"webhook invoked with payload: {payload}")
15
+ return JobResult(success=True)
@@ -0,0 +1,43 @@
1
+ base_url: http://host.docker.internal:5000
2
+ auth_retrieval:
3
+ type: basic
4
+ api_id_secret:
5
+ type: env
6
+ env_key: API_ID
7
+ api_key_secret:
8
+ type: env
9
+ env_key: API_SECRET_KEY
10
+ jobs:
11
+ - id: example_cron
12
+ enabled: true
13
+ type: cron
14
+ name: MyCron - Example
15
+ cron_spec: "* * * * *"
16
+ executor:
17
+ type: script
18
+ import_path: example_cron
19
+ logging_settings:
20
+ enabled: true
21
+ share_with_user_groups:
22
+ - admin:
23
+ type: ref_name
24
+ ref_name: admin
25
+
26
+ - id: example_wh1
27
+ type: webhook
28
+ name: Webhook 1
29
+ signature_key_secret:
30
+ type: env
31
+ env_key: WH1_SIGNATURE_KEY
32
+ executor:
33
+ type: script
34
+ import_path: example_wh
35
+ - id: example_wh2
36
+ type: webhook
37
+ name: Webhook 2
38
+ signature_key_secret:
39
+ type: env
40
+ env_key: WH2_SIGNATURE_KEY
41
+ executor:
42
+ type: script
43
+ import_path: example_wh
@@ -96,6 +96,10 @@ class SerialClassDataInspector:
96
96
  def named_type_path(self) -> Optional[str]:
97
97
  return self.current.named_type_path
98
98
 
99
+ @property
100
+ def is_field_proper(self) -> bool:
101
+ return self.current.from_decorator and self.current.named_type_path is not None
102
+
99
103
 
100
104
  def _get_merged_serial_class_data(type_class: type[Any]) -> _SerialClassData | None:
101
105
  base_class_data = (
@@ -22,8 +22,8 @@ PureJsonScalar = Union[str, float, bool, None]
22
22
  # Regular expressions for identifying ref names and IDs. Ref names should be
23
23
  # using this regular expression as a constriant in the database.
24
24
  REF_NAME_REGEX = r"^[a-zA-Z0-9_/-]+$"
25
- # Does not support nonpositive integers at the moment.
26
- ID_REGEX = r"[1-9][0-9]{0,20}"
25
+ # Ids matching a strict integer number are converted to integers
26
+ ID_REGEX = r"-?[1-9][0-9]{0,20}"
27
27
 
28
28
 
29
29
  if TYPE_CHECKING:
@@ -0,0 +1,137 @@
1
+ from typing import assert_never
2
+
3
+ from uncountable.core.client import Client
4
+ from uncountable.integration.executors.generic_upload_executor import GenericUploadJob
5
+ from uncountable.integration.executors.script_executor import resolve_script_executor
6
+ from uncountable.integration.job import Job, JobArguments
7
+ from uncountable.types import (
8
+ async_jobs_t,
9
+ entity_t,
10
+ field_values_t,
11
+ identifier_t,
12
+ job_definition_t,
13
+ transition_entity_phase_t,
14
+ )
15
+
16
+
17
+ def resolve_executor(
18
+ job_executor: job_definition_t.JobExecutor,
19
+ profile_metadata: job_definition_t.ProfileMetadata,
20
+ ) -> Job:
21
+ match job_executor:
22
+ case job_definition_t.JobExecutorScript():
23
+ return resolve_script_executor(
24
+ job_executor, profile_metadata=profile_metadata
25
+ )
26
+ case job_definition_t.JobExecutorGenericUpload():
27
+ return GenericUploadJob(
28
+ remote_directories=job_executor.remote_directories,
29
+ upload_strategy=job_executor.upload_strategy,
30
+ data_source=job_executor.data_source,
31
+ )
32
+ assert_never(job_executor)
33
+
34
+
35
+ def _create_run_entity(
36
+ *, client: Client, logging_settings: job_definition_t.JobLoggingSettings
37
+ ) -> entity_t.Entity:
38
+ run_entity = client.create_entity(
39
+ entity_type=entity_t.EntityType.ASYNC_JOB,
40
+ definition_key=identifier_t.IdentifierKeyRefName(
41
+ ref_name="unc_integration_server_run_definition"
42
+ ),
43
+ field_values=[
44
+ field_values_t.FieldRefNameValue(
45
+ field_ref_name=async_jobs_t.ASYNC_JOB_TYPE_FIELD_REF_NAME,
46
+ value=async_jobs_t.AsyncJobType.INTEGRATION_SERVER_RUN,
47
+ ),
48
+ field_values_t.FieldRefNameValue(
49
+ field_ref_name=async_jobs_t.ASYNC_JOB_STATUS_FIELD_REF_NAME,
50
+ value=async_jobs_t.AsyncJobStatus.IN_PROGRESS,
51
+ ),
52
+ ],
53
+ ).entity
54
+ client.transition_entity_phase(
55
+ entity=run_entity,
56
+ transition=transition_entity_phase_t.TransitionIdentifierPhases(
57
+ phase_from_key=identifier_t.IdentifierKeyRefName(
58
+ ref_name="unc_integration_server_run__queued"
59
+ ),
60
+ phase_to_key=identifier_t.IdentifierKeyRefName(
61
+ ref_name="unc_integration_server_run__started"
62
+ ),
63
+ ),
64
+ )
65
+ if logging_settings.share_with_user_groups is not None:
66
+ client.grant_entity_permissions(
67
+ entity_type=entity_t.EntityType.ASYNC_JOB,
68
+ entity_key=identifier_t.IdentifierKeyId(id=run_entity.id),
69
+ permission_types=[
70
+ entity_t.EntityPermissionType.READ,
71
+ entity_t.EntityPermissionType.WRITE,
72
+ ],
73
+ user_group_keys=logging_settings.share_with_user_groups,
74
+ )
75
+ return run_entity
76
+
77
+
78
+ def execute_job(
79
+ *,
80
+ job_definition: job_definition_t.JobDefinition,
81
+ profile_metadata: job_definition_t.ProfileMetadata,
82
+ args: JobArguments,
83
+ ) -> job_definition_t.JobResult:
84
+ with args.logger.push_scope(job_definition.name) as job_logger:
85
+ job = resolve_executor(job_definition.executor, profile_metadata)
86
+
87
+ job_logger.log_info("running job")
88
+
89
+ run_entity: entity_t.Entity | None = None
90
+ try:
91
+ if (
92
+ job_definition.logging_settings is not None
93
+ and job_definition.logging_settings.enabled
94
+ ):
95
+ run_entity = _create_run_entity(
96
+ client=args.client, logging_settings=job_definition.logging_settings
97
+ )
98
+ result = job.run_outer(args=args)
99
+ except Exception as e:
100
+ job_logger.log_exception(e)
101
+ if run_entity is not None:
102
+ args.client.set_values(
103
+ entity=run_entity,
104
+ values=[
105
+ field_values_t.ArgumentValueRefName(
106
+ field_ref_name=async_jobs_t.ASYNC_JOB_STATUS_FIELD_REF_NAME,
107
+ value=async_jobs_t.AsyncJobStatus.ERROR,
108
+ ),
109
+ ],
110
+ )
111
+ return job_definition_t.JobResult(success=False)
112
+
113
+ if args.batch_processor.current_queue_size() != 0:
114
+ args.batch_processor.send()
115
+
116
+ submitted_batch_job_ids = args.batch_processor.get_submitted_job_ids()
117
+ job_logger.log_info(
118
+ "completed job",
119
+ attributes={
120
+ "submitted_batch_job_ids": submitted_batch_job_ids,
121
+ "success": result.success,
122
+ },
123
+ )
124
+ if run_entity is not None:
125
+ args.client.set_values(
126
+ entity=run_entity,
127
+ values=[
128
+ field_values_t.ArgumentValueRefName(
129
+ field_ref_name=async_jobs_t.ASYNC_JOB_STATUS_FIELD_REF_NAME,
130
+ value=async_jobs_t.AsyncJobStatus.COMPLETED
131
+ if result.success
132
+ else async_jobs_t.AsyncJobStatus.ERROR,
133
+ ),
134
+ ],
135
+ )
136
+
137
+ return result
@@ -8,6 +8,7 @@ from opentelemetry.trace import get_current_span
8
8
  from uncountable.integration.db.connect import IntegrationDBService, create_db_engine
9
9
  from uncountable.integration.db.session import get_session_maker
10
10
  from uncountable.integration.queue_runner.command_server import (
11
+ CommandEnqueueJob,
11
12
  CommandEnqueueJobResponse,
12
13
  CommandQueue,
13
14
  CommandTask,
@@ -99,6 +100,41 @@ async def start_scheduler(command_queue: CommandQueue) -> None:
99
100
  return
100
101
  await worker.listen_queue.put(queued_job)
101
102
 
103
+ async def _enqueue_or_deduplicate_job(
104
+ job_ref_name: str,
105
+ payload: queued_job_t.QueuedJobPayload,
106
+ ) -> str:
107
+ if isinstance(
108
+ payload.invocation_context,
109
+ queued_job_t.InvocationContextCron,
110
+ ):
111
+ existing_queued_jobs = datastore.load_job_queue()
112
+ duplicate_job = next(
113
+ (
114
+ job
115
+ for job in existing_queued_jobs
116
+ if job.job_ref_name == job_ref_name
117
+ ),
118
+ None,
119
+ )
120
+ if duplicate_job is not None:
121
+ return duplicate_job.queued_job_uuid
122
+ queued_job = datastore.add_job_to_queue(
123
+ job_payload=payload,
124
+ job_ref_name=job_ref_name,
125
+ )
126
+ await enqueue_queued_job(queued_job)
127
+ return queued_job.queued_job_uuid
128
+
129
+ async def _handle_enqueue_job_command(command: CommandEnqueueJob) -> None:
130
+ queued_job_uuid = await _enqueue_or_deduplicate_job(
131
+ job_ref_name=command.job_ref_name,
132
+ payload=command.payload,
133
+ )
134
+ await command.response_queue.put(
135
+ CommandEnqueueJobResponse(queued_job_uuid=queued_job_uuid)
136
+ )
137
+
102
138
  for queued_job in queued_jobs:
103
139
  await enqueue_queued_job(queued_job)
104
140
 
@@ -112,15 +148,11 @@ async def start_scheduler(command_queue: CommandQueue) -> None:
112
148
  for task in finished:
113
149
  if task == command_task:
114
150
  command = command_task.result()
115
- queued_job = datastore.add_job_to_queue(
116
- job_payload=command.payload, job_ref_name=command.job_ref_name
117
- )
118
- await command.response_queue.put(
119
- CommandEnqueueJobResponse(
120
- queued_job_uuid=queued_job.queued_job_uuid
121
- )
122
- )
123
- await enqueue_queued_job(queued_job)
151
+ match command:
152
+ case CommandEnqueueJob():
153
+ await _handle_enqueue_job_command(command=command)
154
+ case _:
155
+ typing.assert_never(command)
124
156
  command_task = asyncio.create_task(command_queue.get())
125
157
  elif task == result_task:
126
158
  queued_job_result = result_task.result()
@@ -106,3 +106,6 @@ def run_queued_job(
106
106
  except Exception as e:
107
107
  job_logger.log_exception(e)
108
108
  return job_definition_t.JobResult(success=False)
109
+ except BaseException as e:
110
+ job_logger.log_exception(e)
111
+ raise e
@@ -39,8 +39,8 @@ PureJsonScalar = Union[str, float, bool, None]
39
39
  # Regular expressions for identifying ref names and IDs. Ref names should be
40
40
  # using this regular expression as a constriant in the database.
41
41
  REF_NAME_REGEX = r"^[a-zA-Z0-9_/-]+$"
42
- # Does not support nonpositive integers at the moment.
43
- ID_REGEX = r"[1-9][0-9]{0,20}"
42
+ # Ids matching a strict integer number are converted to integers
43
+ ID_REGEX = r"-?[1-9][0-9]{0,20}"
44
44
 
45
45
 
46
46
  if TYPE_CHECKING:
@@ -70,10 +70,12 @@ __all__: list[str] = [
70
70
  "ingredient": "Ingredient",
71
71
  "ingredient_attribute": "Ingredient Attribute",
72
72
  "ingredient_attribute_category": "Ingredient Attribute Category",
73
+ "ingredient_attribute_value": "Ingredient Attribute Value",
73
74
  "ingredient_category": "Ingredient Category (Project)",
74
75
  "ingredient_category_all": "Ingredient Category",
75
76
  "ingredient_category_all_material_family": "Ingredient Category Material Family",
76
77
  "ingredient_lot": "Ingredient Lot",
78
+ "ingredient_mat_family": "Ingredient Material Family",
77
79
  "ingredient_role": "Ingredient Role",
78
80
  "ingredient_tag": "Ingredient Subcategory",
79
81
  "ingredient_tag_map": "Ingredient Tag Map",
@@ -225,10 +227,12 @@ class EntityType(StrEnum):
225
227
  INGREDIENT = "ingredient"
226
228
  INGREDIENT_ATTRIBUTE = "ingredient_attribute"
227
229
  INGREDIENT_ATTRIBUTE_CATEGORY = "ingredient_attribute_category"
230
+ INGREDIENT_ATTRIBUTE_VALUE = "ingredient_attribute_value"
228
231
  INGREDIENT_CATEGORY = "ingredient_category"
229
232
  INGREDIENT_CATEGORY_ALL = "ingredient_category_all"
230
233
  INGREDIENT_CATEGORY_ALL_MATERIAL_FAMILY = "ingredient_category_all_material_family"
231
234
  INGREDIENT_LOT = "ingredient_lot"
235
+ INGREDIENT_MAT_FAMILY = "ingredient_mat_family"
232
236
  INGREDIENT_ROLE = "ingredient_role"
233
237
  INGREDIENT_TAG = "ingredient_tag"
234
238
  INGREDIENT_TAG_MAP = "ingredient_tag_map"
@@ -12,9 +12,9 @@ import dataclasses
12
12
  from pkgs.serialization import serial_class
13
13
  from pkgs.serialization import serial_union_annotation
14
14
  from . import auth_retrieval_t
15
- from . import base_t
16
15
  from . import client_config_t
17
16
  from . import generic_upload_t
17
+ from . import identifier_t
18
18
  from . import integration_server_t
19
19
  from . import secret_retrieval_t
20
20
 
@@ -172,7 +172,7 @@ JobExecutor = typing.Annotated[
172
172
  @dataclasses.dataclass(kw_only=True)
173
173
  class JobLoggingSettings:
174
174
  enabled: bool = False
175
- share_with_user_groups: typing.Optional[list[base_t.ObjectId]] = None
175
+ share_with_user_groups: typing.Optional[list[identifier_t.IdentifierKey]] = None
176
176
 
177
177
 
178
178
  # DO NOT MODIFY -- This file is generated by type_spec
@@ -1,19 +0,0 @@
1
- base_url: http://host.docker.internal:5000
2
- auth_retrieval:
3
- type: basic
4
- api_id_secret:
5
- type: env
6
- env_key: API_ID
7
- api_key_secret:
8
- type: env
9
- env_key: API_SECRET_KEY
10
- jobs:
11
- - id: example_cron
12
- enabled: true
13
- type: cron
14
- name: MyCron - Example
15
- cron_spec: "* * * * *"
16
- executor:
17
- type: script
18
- import_path: example_cron
19
-
@@ -1,56 +0,0 @@
1
- from typing import assert_never
2
-
3
- from uncountable.integration.executors.generic_upload_executor import GenericUploadJob
4
- from uncountable.integration.executors.script_executor import resolve_script_executor
5
- from uncountable.integration.job import Job, JobArguments
6
- from uncountable.types import job_definition_t
7
-
8
-
9
- def resolve_executor(
10
- job_executor: job_definition_t.JobExecutor,
11
- profile_metadata: job_definition_t.ProfileMetadata,
12
- ) -> Job:
13
- match job_executor:
14
- case job_definition_t.JobExecutorScript():
15
- return resolve_script_executor(
16
- job_executor, profile_metadata=profile_metadata
17
- )
18
- case job_definition_t.JobExecutorGenericUpload():
19
- return GenericUploadJob(
20
- remote_directories=job_executor.remote_directories,
21
- upload_strategy=job_executor.upload_strategy,
22
- data_source=job_executor.data_source,
23
- )
24
- assert_never(job_executor)
25
-
26
-
27
- def execute_job(
28
- *,
29
- job_definition: job_definition_t.JobDefinition,
30
- profile_metadata: job_definition_t.ProfileMetadata,
31
- args: JobArguments,
32
- ) -> job_definition_t.JobResult:
33
- with args.logger.push_scope(job_definition.name) as job_logger:
34
- job = resolve_executor(job_definition.executor, profile_metadata)
35
-
36
- job_logger.log_info("running job")
37
-
38
- try:
39
- result = job.run_outer(args=args)
40
- except Exception as e:
41
- job_logger.log_exception(e)
42
- return job_definition_t.JobResult(success=False)
43
-
44
- if args.batch_processor.current_queue_size() != 0:
45
- args.batch_processor.send()
46
-
47
- submitted_batch_job_ids = args.batch_processor.get_submitted_job_ids()
48
- job_logger.log_info(
49
- "completed job",
50
- attributes={
51
- "submitted_batch_job_ids": submitted_batch_job_ids,
52
- "success": result.success,
53
- },
54
- )
55
-
56
- return result