UncountablePythonSDK 0.0.7__tar.gz → 0.0.9__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (156) hide show
  1. {UncountablePythonSDK-0.0.7 → UncountablePythonSDK-0.0.9}/PKG-INFO +4 -2
  2. {UncountablePythonSDK-0.0.7 → UncountablePythonSDK-0.0.9}/UncountablePythonSDK.egg-info/PKG-INFO +4 -2
  3. {UncountablePythonSDK-0.0.7 → UncountablePythonSDK-0.0.9}/UncountablePythonSDK.egg-info/SOURCES.txt +26 -0
  4. {UncountablePythonSDK-0.0.7 → UncountablePythonSDK-0.0.9}/UncountablePythonSDK.egg-info/requires.txt +3 -1
  5. {UncountablePythonSDK-0.0.7 → UncountablePythonSDK-0.0.9}/pkgs/argument_parser/argument_parser.py +2 -2
  6. {UncountablePythonSDK-0.0.7 → UncountablePythonSDK-0.0.9}/pkgs/serialization/missing_sentry.py +1 -1
  7. {UncountablePythonSDK-0.0.7 → UncountablePythonSDK-0.0.9}/pkgs/serialization_util/serialization_helpers.py +3 -0
  8. {UncountablePythonSDK-0.0.7 → UncountablePythonSDK-0.0.9}/pkgs/type_spec/emit_open_api.py +34 -17
  9. {UncountablePythonSDK-0.0.7 → UncountablePythonSDK-0.0.9}/pkgs/type_spec/emit_open_api_util.py +4 -9
  10. {UncountablePythonSDK-0.0.7 → UncountablePythonSDK-0.0.9}/pkgs/type_spec/emit_python.py +8 -5
  11. {UncountablePythonSDK-0.0.7 → UncountablePythonSDK-0.0.9}/pkgs/type_spec/open_api_util.py +13 -12
  12. {UncountablePythonSDK-0.0.7 → UncountablePythonSDK-0.0.9}/pyproject.toml +3 -1
  13. {UncountablePythonSDK-0.0.7 → UncountablePythonSDK-0.0.9}/type_spec/external/api/entity/create_entities.yaml +1 -1
  14. {UncountablePythonSDK-0.0.7 → UncountablePythonSDK-0.0.9}/type_spec/external/api/entity/create_entity.yaml +1 -1
  15. UncountablePythonSDK-0.0.9/type_spec/external/api/entity/get_entities_data.yaml +29 -0
  16. {UncountablePythonSDK-0.0.7 → UncountablePythonSDK-0.0.9}/type_spec/external/api/entity/list_entities.yaml +4 -14
  17. {UncountablePythonSDK-0.0.7 → UncountablePythonSDK-0.0.9}/type_spec/external/api/entity/resolve_entity_ids.yaml +2 -2
  18. UncountablePythonSDK-0.0.9/type_spec/external/api/entity/set_values.yaml +18 -0
  19. {UncountablePythonSDK-0.0.7 → UncountablePythonSDK-0.0.9}/type_spec/external/api/input_groups/get_input_group_names.yaml +2 -2
  20. {UncountablePythonSDK-0.0.7 → UncountablePythonSDK-0.0.9}/type_spec/external/api/inputs/create_inputs.yaml +6 -19
  21. {UncountablePythonSDK-0.0.7 → UncountablePythonSDK-0.0.9}/type_spec/external/api/inputs/get_input_data.yaml +11 -24
  22. {UncountablePythonSDK-0.0.7 → UncountablePythonSDK-0.0.9}/type_spec/external/api/inputs/get_input_names.yaml +4 -4
  23. {UncountablePythonSDK-0.0.7 → UncountablePythonSDK-0.0.9}/type_spec/external/api/inputs/get_inputs_data.yaml +7 -20
  24. {UncountablePythonSDK-0.0.7 → UncountablePythonSDK-0.0.9}/type_spec/external/api/inputs/set_input_attribute_values.yaml +3 -7
  25. {UncountablePythonSDK-0.0.7 → UncountablePythonSDK-0.0.9}/type_spec/external/api/outputs/get_output_data.yaml +9 -20
  26. {UncountablePythonSDK-0.0.7 → UncountablePythonSDK-0.0.9}/type_spec/external/api/outputs/get_output_names.yaml +2 -2
  27. {UncountablePythonSDK-0.0.7 → UncountablePythonSDK-0.0.9}/type_spec/external/api/project/get_projects.yaml +6 -16
  28. {UncountablePythonSDK-0.0.7 → UncountablePythonSDK-0.0.9}/type_spec/external/api/project/get_projects_data.yaml +10 -46
  29. {UncountablePythonSDK-0.0.7 → UncountablePythonSDK-0.0.9}/type_spec/external/api/recipe_metadata/get_recipe_metadata_data.yaml +5 -5
  30. {UncountablePythonSDK-0.0.7 → UncountablePythonSDK-0.0.9}/type_spec/external/api/recipes/create_recipes.yaml +5 -18
  31. UncountablePythonSDK-0.0.9/type_spec/external/api/recipes/get_curve.yaml +18 -0
  32. {UncountablePythonSDK-0.0.7 → UncountablePythonSDK-0.0.9}/type_spec/external/api/recipes/get_recipe_calculations.yaml +7 -17
  33. {UncountablePythonSDK-0.0.7 → UncountablePythonSDK-0.0.9}/type_spec/external/api/recipes/get_recipe_links.yaml +1 -1
  34. {UncountablePythonSDK-0.0.7 → UncountablePythonSDK-0.0.9}/type_spec/external/api/recipes/get_recipe_names.yaml +2 -2
  35. {UncountablePythonSDK-0.0.7 → UncountablePythonSDK-0.0.9}/type_spec/external/api/recipes/get_recipe_output_metadata.yaml +4 -17
  36. {UncountablePythonSDK-0.0.7 → UncountablePythonSDK-0.0.9}/type_spec/external/api/recipes/get_recipes_data.yaml +31 -165
  37. {UncountablePythonSDK-0.0.7 → UncountablePythonSDK-0.0.9}/type_spec/external/api/recipes/set_recipe_inputs.yaml +3 -3
  38. {UncountablePythonSDK-0.0.7 → UncountablePythonSDK-0.0.9}/type_spec/external/api/recipes/set_recipe_outputs.yaml +4 -8
  39. UncountablePythonSDK-0.0.9/uncountable/integration/construct_client.py +30 -0
  40. UncountablePythonSDK-0.0.9/uncountable/integration/cron.py +29 -0
  41. UncountablePythonSDK-0.0.9/uncountable/integration/db/__init__.py +0 -0
  42. UncountablePythonSDK-0.0.9/uncountable/integration/db/connect.py +8 -0
  43. UncountablePythonSDK-0.0.9/uncountable/integration/entrypoint.py +41 -0
  44. UncountablePythonSDK-0.0.9/uncountable/integration/executors/__init__.py +0 -0
  45. UncountablePythonSDK-0.0.9/uncountable/integration/executors/script_executor.py +18 -0
  46. UncountablePythonSDK-0.0.9/uncountable/integration/job.py +39 -0
  47. UncountablePythonSDK-0.0.9/uncountable/integration/server.py +86 -0
  48. UncountablePythonSDK-0.0.9/uncountable/integration/types.py +89 -0
  49. UncountablePythonSDK-0.0.9/uncountable/py.typed +0 -0
  50. {UncountablePythonSDK-0.0.7 → UncountablePythonSDK-0.0.9}/uncountable/types/__init__.py +30 -0
  51. {UncountablePythonSDK-0.0.7 → UncountablePythonSDK-0.0.9}/uncountable/types/api/entity/create_entities.py +2 -1
  52. {UncountablePythonSDK-0.0.7 → UncountablePythonSDK-0.0.9}/uncountable/types/api/entity/create_entity.py +1 -1
  53. UncountablePythonSDK-0.0.9/uncountable/types/api/entity/get_entities_data.py +45 -0
  54. {UncountablePythonSDK-0.0.7 → UncountablePythonSDK-0.0.9}/uncountable/types/api/entity/list_entities.py +5 -12
  55. {UncountablePythonSDK-0.0.7 → UncountablePythonSDK-0.0.9}/uncountable/types/api/entity/resolve_entity_ids.py +4 -2
  56. UncountablePythonSDK-0.0.9/uncountable/types/api/entity/set_values.py +37 -0
  57. {UncountablePythonSDK-0.0.7 → UncountablePythonSDK-0.0.9}/uncountable/types/api/input_groups/get_input_group_names.py +3 -2
  58. {UncountablePythonSDK-0.0.7 → UncountablePythonSDK-0.0.9}/uncountable/types/api/inputs/create_inputs.py +8 -20
  59. {UncountablePythonSDK-0.0.7 → UncountablePythonSDK-0.0.9}/uncountable/types/api/inputs/get_input_data.py +12 -25
  60. {UncountablePythonSDK-0.0.7 → UncountablePythonSDK-0.0.9}/uncountable/types/api/inputs/get_input_names.py +5 -4
  61. {UncountablePythonSDK-0.0.7 → UncountablePythonSDK-0.0.9}/uncountable/types/api/inputs/get_inputs_data.py +8 -21
  62. {UncountablePythonSDK-0.0.7 → UncountablePythonSDK-0.0.9}/uncountable/types/api/inputs/set_input_attribute_values.py +5 -7
  63. {UncountablePythonSDK-0.0.7 → UncountablePythonSDK-0.0.9}/uncountable/types/api/outputs/get_output_data.py +10 -17
  64. {UncountablePythonSDK-0.0.7 → UncountablePythonSDK-0.0.9}/uncountable/types/api/outputs/get_output_names.py +3 -2
  65. {UncountablePythonSDK-0.0.7 → UncountablePythonSDK-0.0.9}/uncountable/types/api/project/get_projects.py +8 -14
  66. {UncountablePythonSDK-0.0.7 → UncountablePythonSDK-0.0.9}/uncountable/types/api/project/get_projects_data.py +13 -40
  67. {UncountablePythonSDK-0.0.7 → UncountablePythonSDK-0.0.9}/uncountable/types/api/recipe_metadata/get_recipe_metadata_data.py +6 -5
  68. {UncountablePythonSDK-0.0.7 → UncountablePythonSDK-0.0.9}/uncountable/types/api/recipes/create_recipes.py +6 -18
  69. UncountablePythonSDK-0.0.9/uncountable/types/api/recipes/get_curve.py +35 -0
  70. {UncountablePythonSDK-0.0.7 → UncountablePythonSDK-0.0.9}/uncountable/types/api/recipes/get_recipe_calculations.py +8 -15
  71. {UncountablePythonSDK-0.0.7 → UncountablePythonSDK-0.0.9}/uncountable/types/api/recipes/get_recipe_links.py +2 -1
  72. {UncountablePythonSDK-0.0.7 → UncountablePythonSDK-0.0.9}/uncountable/types/api/recipes/get_recipe_names.py +3 -2
  73. {UncountablePythonSDK-0.0.7 → UncountablePythonSDK-0.0.9}/uncountable/types/api/recipes/get_recipe_output_metadata.py +5 -13
  74. {UncountablePythonSDK-0.0.7 → UncountablePythonSDK-0.0.9}/uncountable/types/api/recipes/get_recipes_data.py +36 -122
  75. {UncountablePythonSDK-0.0.7 → UncountablePythonSDK-0.0.9}/uncountable/types/api/recipes/set_recipe_inputs.py +4 -3
  76. {UncountablePythonSDK-0.0.7 → UncountablePythonSDK-0.0.9}/uncountable/types/api/recipes/set_recipe_outputs.py +7 -8
  77. UncountablePythonSDK-0.0.9/uncountable/types/calculations.py +23 -0
  78. {UncountablePythonSDK-0.0.7 → UncountablePythonSDK-0.0.9}/uncountable/types/client_base.py +43 -43
  79. UncountablePythonSDK-0.0.7/uncountable/types/api/recipes/get_curve.py → UncountablePythonSDK-0.0.9/uncountable/types/curves.py +14 -24
  80. {UncountablePythonSDK-0.0.7 → UncountablePythonSDK-0.0.9}/uncountable/types/entity.py +4 -1
  81. UncountablePythonSDK-0.0.9/uncountable/types/experiment_groups.py +23 -0
  82. UncountablePythonSDK-0.0.7/uncountable/types/api/entity/set_values.py → UncountablePythonSDK-0.0.9/uncountable/types/field_values.py +26 -20
  83. UncountablePythonSDK-0.0.9/uncountable/types/fields.py +24 -0
  84. UncountablePythonSDK-0.0.9/uncountable/types/input_attributes.py +29 -0
  85. UncountablePythonSDK-0.0.9/uncountable/types/inputs.py +61 -0
  86. UncountablePythonSDK-0.0.9/uncountable/types/outputs.py +26 -0
  87. UncountablePythonSDK-0.0.9/uncountable/types/phases.py +23 -0
  88. {UncountablePythonSDK-0.0.7 → UncountablePythonSDK-0.0.9}/uncountable/types/recipe_links.py +3 -2
  89. UncountablePythonSDK-0.0.9/uncountable/types/recipe_metadata.py +50 -0
  90. UncountablePythonSDK-0.0.9/uncountable/types/recipe_output_metadata.py +24 -0
  91. UncountablePythonSDK-0.0.9/uncountable/types/recipe_tags.py +23 -0
  92. UncountablePythonSDK-0.0.7/uncountable/types/field_values.py → UncountablePythonSDK-0.0.9/uncountable/types/response.py +4 -7
  93. UncountablePythonSDK-0.0.9/uncountable/types/units.py +23 -0
  94. UncountablePythonSDK-0.0.9/uncountable/types/users.py +24 -0
  95. UncountablePythonSDK-0.0.9/uncountable/types/workflows.py +32 -0
  96. UncountablePythonSDK-0.0.7/type_spec/external/api/entity/get_entities_data.yaml +0 -55
  97. UncountablePythonSDK-0.0.7/type_spec/external/api/entity/set_values.yaml +0 -45
  98. UncountablePythonSDK-0.0.7/type_spec/external/api/recipes/get_curve.yaml +0 -50
  99. UncountablePythonSDK-0.0.7/uncountable/types/api/entity/get_entities_data.py +0 -65
  100. {UncountablePythonSDK-0.0.7 → UncountablePythonSDK-0.0.9}/.github/workflows/publish.yml +0 -0
  101. {UncountablePythonSDK-0.0.7 → UncountablePythonSDK-0.0.9}/.gitignore +0 -0
  102. {UncountablePythonSDK-0.0.7 → UncountablePythonSDK-0.0.9}/UncountablePythonSDK.egg-info/dependency_links.txt +0 -0
  103. {UncountablePythonSDK-0.0.7 → UncountablePythonSDK-0.0.9}/UncountablePythonSDK.egg-info/top_level.txt +0 -0
  104. {UncountablePythonSDK-0.0.7 → UncountablePythonSDK-0.0.9}/examples/create_entity.py +0 -0
  105. {UncountablePythonSDK-0.0.7 → UncountablePythonSDK-0.0.9}/examples/recipe-import/importer.py +0 -0
  106. {UncountablePythonSDK-0.0.7 → UncountablePythonSDK-0.0.9}/pkgs/__init__.py +0 -0
  107. {UncountablePythonSDK-0.0.7 → UncountablePythonSDK-0.0.9}/pkgs/argument_parser/__init__.py +0 -0
  108. {UncountablePythonSDK-0.0.7 → UncountablePythonSDK-0.0.9}/pkgs/argument_parser/_is_enum.py +0 -0
  109. {UncountablePythonSDK-0.0.7 → UncountablePythonSDK-0.0.9}/pkgs/argument_parser/_is_namedtuple.py +0 -0
  110. {UncountablePythonSDK-0.0.7 → UncountablePythonSDK-0.0.9}/pkgs/argument_parser/case_convert.py +0 -0
  111. {UncountablePythonSDK-0.0.7 → UncountablePythonSDK-0.0.9}/pkgs/serialization/__init__.py +0 -0
  112. {UncountablePythonSDK-0.0.7 → UncountablePythonSDK-0.0.9}/pkgs/serialization/opaque_key.py +0 -0
  113. {UncountablePythonSDK-0.0.7 → UncountablePythonSDK-0.0.9}/pkgs/serialization/serial_class.py +0 -0
  114. {UncountablePythonSDK-0.0.7 → UncountablePythonSDK-0.0.9}/pkgs/serialization_util/__init__.py +0 -0
  115. {UncountablePythonSDK-0.0.7 → UncountablePythonSDK-0.0.9}/pkgs/serialization_util/_get_type_for_serialization.py +0 -0
  116. {UncountablePythonSDK-0.0.7 → UncountablePythonSDK-0.0.9}/pkgs/strenum_compat/__init__.py +0 -0
  117. {UncountablePythonSDK-0.0.7 → UncountablePythonSDK-0.0.9}/pkgs/strenum_compat/strenum_compat.py +0 -0
  118. {UncountablePythonSDK-0.0.7 → UncountablePythonSDK-0.0.9}/pkgs/type_spec/__init__.py +0 -0
  119. {UncountablePythonSDK-0.0.7 → UncountablePythonSDK-0.0.9}/pkgs/type_spec/__main__.py +0 -0
  120. {UncountablePythonSDK-0.0.7 → UncountablePythonSDK-0.0.9}/pkgs/type_spec/builder.py +0 -0
  121. {UncountablePythonSDK-0.0.7 → UncountablePythonSDK-0.0.9}/pkgs/type_spec/config.py +0 -0
  122. {UncountablePythonSDK-0.0.7 → UncountablePythonSDK-0.0.9}/pkgs/type_spec/emit_io_ts.py +0 -0
  123. {UncountablePythonSDK-0.0.7 → UncountablePythonSDK-0.0.9}/pkgs/type_spec/emit_typescript.py +0 -0
  124. {UncountablePythonSDK-0.0.7 → UncountablePythonSDK-0.0.9}/pkgs/type_spec/emit_typescript_util.py +0 -0
  125. {UncountablePythonSDK-0.0.7 → UncountablePythonSDK-0.0.9}/pkgs/type_spec/load_types.py +0 -0
  126. {UncountablePythonSDK-0.0.7 → UncountablePythonSDK-0.0.9}/pkgs/type_spec/parts/base.py.prepart +0 -0
  127. {UncountablePythonSDK-0.0.7 → UncountablePythonSDK-0.0.9}/pkgs/type_spec/parts/base.ts.prepart +0 -0
  128. {UncountablePythonSDK-0.0.7 → UncountablePythonSDK-0.0.9}/pkgs/type_spec/test.py +0 -0
  129. {UncountablePythonSDK-0.0.7 → UncountablePythonSDK-0.0.9}/pkgs/type_spec/type_info/__main__.py +0 -0
  130. {UncountablePythonSDK-0.0.7 → UncountablePythonSDK-0.0.9}/pkgs/type_spec/type_info/emit_type_info.py +0 -0
  131. {UncountablePythonSDK-0.0.7 → UncountablePythonSDK-0.0.9}/pkgs/type_spec/util.py +0 -0
  132. {UncountablePythonSDK-0.0.7 → UncountablePythonSDK-0.0.9}/pkgs/type_spec/value_spec/__init__.py +0 -0
  133. {UncountablePythonSDK-0.0.7 → UncountablePythonSDK-0.0.9}/pkgs/type_spec/value_spec/__main__.py +0 -0
  134. {UncountablePythonSDK-0.0.7 → UncountablePythonSDK-0.0.9}/pkgs/type_spec/value_spec/convert_type.py +0 -0
  135. {UncountablePythonSDK-0.0.7 → UncountablePythonSDK-0.0.9}/pkgs/type_spec/value_spec/emit_python.py +0 -0
  136. {UncountablePythonSDK-0.0.7 → UncountablePythonSDK-0.0.9}/pkgs/type_spec/value_spec/types.py +0 -0
  137. {UncountablePythonSDK-0.0.7 → UncountablePythonSDK-0.0.9}/requirements.txt +0 -0
  138. {UncountablePythonSDK-0.0.7 → UncountablePythonSDK-0.0.9}/setup.cfg +0 -0
  139. {UncountablePythonSDK-0.0.7 → UncountablePythonSDK-0.0.9}/type_spec/external/api/batch/execute_batch.yaml +0 -0
  140. {UncountablePythonSDK-0.0.7 → UncountablePythonSDK-0.0.9}/type_spec/external/api/outputs/resolve_output_conditions.yaml +0 -0
  141. {UncountablePythonSDK-0.0.7 → UncountablePythonSDK-0.0.9}/uncountable/__init__.py +0 -0
  142. {UncountablePythonSDK-0.0.7 → UncountablePythonSDK-0.0.9}/uncountable/core/__init__.py +0 -0
  143. {UncountablePythonSDK-0.0.7 → UncountablePythonSDK-0.0.9}/uncountable/core/client.py +0 -0
  144. /UncountablePythonSDK-0.0.7/uncountable/py.typed → /UncountablePythonSDK-0.0.9/uncountable/integration/__init__.py +0 -0
  145. {UncountablePythonSDK-0.0.7 → UncountablePythonSDK-0.0.9}/uncountable/types/api/__init__.py +0 -0
  146. {UncountablePythonSDK-0.0.7 → UncountablePythonSDK-0.0.9}/uncountable/types/api/batch/__init__.py +0 -0
  147. {UncountablePythonSDK-0.0.7 → UncountablePythonSDK-0.0.9}/uncountable/types/api/batch/execute_batch.py +0 -0
  148. {UncountablePythonSDK-0.0.7 → UncountablePythonSDK-0.0.9}/uncountable/types/api/entity/__init__.py +0 -0
  149. {UncountablePythonSDK-0.0.7 → UncountablePythonSDK-0.0.9}/uncountable/types/api/input_groups/__init__.py +0 -0
  150. {UncountablePythonSDK-0.0.7 → UncountablePythonSDK-0.0.9}/uncountable/types/api/inputs/__init__.py +0 -0
  151. {UncountablePythonSDK-0.0.7 → UncountablePythonSDK-0.0.9}/uncountable/types/api/outputs/__init__.py +0 -0
  152. {UncountablePythonSDK-0.0.7 → UncountablePythonSDK-0.0.9}/uncountable/types/api/outputs/resolve_output_conditions.py +0 -0
  153. {UncountablePythonSDK-0.0.7 → UncountablePythonSDK-0.0.9}/uncountable/types/api/project/__init__.py +0 -0
  154. {UncountablePythonSDK-0.0.7 → UncountablePythonSDK-0.0.9}/uncountable/types/api/recipe_metadata/__init__.py +0 -0
  155. {UncountablePythonSDK-0.0.7 → UncountablePythonSDK-0.0.9}/uncountable/types/api/recipes/__init__.py +0 -0
  156. {UncountablePythonSDK-0.0.7 → UncountablePythonSDK-0.0.9}/uncountable/types/base.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: UncountablePythonSDK
3
- Version: 0.0.7
3
+ Version: 0.0.9
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,9 @@ Classifier: Topic :: Utilities
16
16
  Classifier: Typing :: Typed
17
17
  Requires-Python: >=3.11
18
18
  Description-Content-Type: text/markdown
19
- Requires-Dist: requests>=2.31.0
19
+ Requires-Dist: requests==2.31.0
20
+ Requires-Dist: SQLAlchemy==2.0.29
21
+ Requires-Dist: APScheduler==3.10.4
20
22
  Provides-Extra: test
21
23
  Requires-Dist: mypy>=1.8.1; extra == "test"
22
24
  Requires-Dist: ruff>=0.2.1; extra == "test"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: UncountablePythonSDK
3
- Version: 0.0.7
3
+ Version: 0.0.9
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,9 @@ Classifier: Topic :: Utilities
16
16
  Classifier: Typing :: Typed
17
17
  Requires-Python: >=3.11
18
18
  Description-Content-Type: text/markdown
19
- Requires-Dist: requests>=2.31.0
19
+ Requires-Dist: requests==2.31.0
20
+ Requires-Dist: SQLAlchemy==2.0.29
21
+ Requires-Dist: APScheduler==3.10.4
20
22
  Provides-Extra: test
21
23
  Requires-Dist: mypy>=1.8.1; extra == "test"
22
24
  Requires-Dist: ruff>=0.2.1; extra == "test"
@@ -79,12 +79,38 @@ uncountable/__init__.py
79
79
  uncountable/py.typed
80
80
  uncountable/core/__init__.py
81
81
  uncountable/core/client.py
82
+ uncountable/integration/__init__.py
83
+ uncountable/integration/construct_client.py
84
+ uncountable/integration/cron.py
85
+ uncountable/integration/entrypoint.py
86
+ uncountable/integration/job.py
87
+ uncountable/integration/server.py
88
+ uncountable/integration/types.py
89
+ uncountable/integration/db/__init__.py
90
+ uncountable/integration/db/connect.py
91
+ uncountable/integration/executors/__init__.py
92
+ uncountable/integration/executors/script_executor.py
82
93
  uncountable/types/__init__.py
83
94
  uncountable/types/base.py
95
+ uncountable/types/calculations.py
84
96
  uncountable/types/client_base.py
97
+ uncountable/types/curves.py
85
98
  uncountable/types/entity.py
99
+ uncountable/types/experiment_groups.py
86
100
  uncountable/types/field_values.py
101
+ uncountable/types/fields.py
102
+ uncountable/types/input_attributes.py
103
+ uncountable/types/inputs.py
104
+ uncountable/types/outputs.py
105
+ uncountable/types/phases.py
87
106
  uncountable/types/recipe_links.py
107
+ uncountable/types/recipe_metadata.py
108
+ uncountable/types/recipe_output_metadata.py
109
+ uncountable/types/recipe_tags.py
110
+ uncountable/types/response.py
111
+ uncountable/types/units.py
112
+ uncountable/types/users.py
113
+ uncountable/types/workflows.py
88
114
  uncountable/types/api/__init__.py
89
115
  uncountable/types/api/batch/__init__.py
90
116
  uncountable/types/api/batch/execute_batch.py
@@ -1,4 +1,6 @@
1
- requests>=2.31.0
1
+ requests==2.31.0
2
+ SQLAlchemy==2.0.29
3
+ APScheduler==3.10.4
2
4
 
3
5
  [test]
4
6
  mypy>=1.8.1
@@ -407,5 +407,5 @@ class CachedParser(typing.Generic[T]):
407
407
  return self.parse_storage(yaml.safe_load(data_in))
408
408
 
409
409
  def parse_yaml_resource(self, package: resources.Package, resource: str) -> T:
410
- raw_data = resources.read_text(package, resource)
411
- return self.parse_storage(yaml.safe_load(raw_data))
410
+ with resources.open_text(package, resource) as fp:
411
+ return self.parse_storage(yaml.safe_load(fp))
@@ -26,5 +26,5 @@ MISSING_SENTRY = MissingSentryType()
26
26
  MissingType = Union[MissingSentryType, ClassT]
27
27
 
28
28
 
29
- def coalesce_missing_sentry(value: MissingType[ClassT]) -> ClassT | None:
29
+ def coalesce_missing_sentry(value: MissingType[ClassT]) -> Optional[ClassT]:
30
30
  return None if isinstance(value, MissingSentryType) else value
@@ -1,4 +1,5 @@
1
1
  import datetime
2
+ import enum
2
3
  from decimal import Decimal
3
4
  from typing import (
4
5
  TYPE_CHECKING,
@@ -33,6 +34,8 @@ else:
33
34
  def key_convert_to_camelcase(o: Any) -> Any:
34
35
  if isinstance(o, OpaqueKey):
35
36
  return o
37
+ if isinstance(o, enum.Enum):
38
+ return o.value
36
39
  if isinstance(o, str):
37
40
  return snake_to_camel_case(o)
38
41
  return o
@@ -141,6 +141,18 @@ def _serialize_global_context(ctx: EmitOpenAPIGlobalContext) -> str:
141
141
  return yaml.dump(oa_root, sort_keys=False)
142
142
 
143
143
 
144
+ def _emit_endpoint_parameters(typ: OpenAPIType | None) -> dict[str, list[dict[str, str]]]:
145
+ if not isinstance(typ, OpenAPIObjectType):
146
+ return {}
147
+
148
+ return {
149
+ "parameters": [
150
+ {"$ref": f"#/components/schema/Arguments/{prop_name}"}
151
+ for prop_name in typ.properties
152
+ ]
153
+ }
154
+
155
+
144
156
  def _emit_namespace(
145
157
  gctx: EmitOpenAPIGlobalContext,
146
158
  ctx: EmitOpenAPIContext,
@@ -159,23 +171,28 @@ def _emit_namespace(
159
171
  if ctx.endpoint is not None:
160
172
  endpoint = ctx.endpoint
161
173
 
174
+ argument_type = ctx.types.get("Arguments")
162
175
  oa_endpoint = dict()
163
- oa_endpoint[endpoint.method] = {
164
- "tags": endpoint.tags,
165
- "summary": endpoint.summary,
166
- "description": endpoint.description,
167
- "parameters": {"$ref": "#/components/schema/Arguments"},
168
- "responses": {
169
- "200": {
170
- "description": "OK",
171
- "content": {
172
- "application/json": {
173
- "schema": {"$ref": "#/components/schema/Data"}
174
- }
175
- },
176
- }
177
- },
178
- }
176
+ oa_endpoint[endpoint.method] = (
177
+ {
178
+ "tags": endpoint.tags,
179
+ "summary": endpoint.summary,
180
+ "description": endpoint.description,
181
+ }
182
+ | _emit_endpoint_parameters(argument_type)
183
+ | {
184
+ "responses": {
185
+ "200": {
186
+ "description": "OK",
187
+ "content": {
188
+ "application/json": {
189
+ "schema": {"$ref": "#/components/schema/Data"}
190
+ }
191
+ },
192
+ }
193
+ },
194
+ }
195
+ )
179
196
  oa_components["endpoint"] = oa_endpoint
180
197
 
181
198
  types = ctx.types
@@ -460,5 +477,5 @@ def open_api_type(
460
477
  ctx.namespaces.add(stype.namespace)
461
478
  # external namespace resolution
462
479
  return OpenAPIRefType(
463
- source=f"{resolve_namespace_ref(ctx, stype.namespace, config=config)}/{stype.name}"
480
+ source=f"{resolve_namespace_ref(source_path=ctx.namespace.path, ref_path=stype.namespace.path, ref='/components/schema')}/{stype.name}"
464
481
  )
@@ -9,7 +9,6 @@ from dataclasses import dataclass, field
9
9
  from typing import TypeAlias
10
10
 
11
11
  from . import builder
12
- from .config import OpenAPIConfig
13
12
  from .open_api_util import OpenAPIType
14
13
 
15
14
  MODIFY_NOTICE = "# DO NOT MODIFY -- This file is generated by type_spec"
@@ -75,12 +74,8 @@ class EmitOpenAPIContext:
75
74
 
76
75
 
77
76
  def resolve_namespace_ref(
78
- ctx: EmitOpenAPIContext,
79
- namespace: builder.SpecNamespace,
80
- *,
81
- config: OpenAPIConfig,
77
+ *, source_path: list[str], ref_path: list[str], ref: str
82
78
  ) -> str:
83
- # TODO: Handle namespaces not in root directory
84
- if len(ctx.namespace.path) == 1:
85
- return f"{namespace.name}.yaml#/components/schema"
86
- return f"{config.static_url_path}/common/{namespace.name}.yaml#/components/schema"
79
+ to_root = "/".join(".." for _ in source_path)
80
+ location = "/".join(ref_path)
81
+ return f"{to_root}/common/{location}.yaml#{ref}"
@@ -335,14 +335,15 @@ def _emit_namespace(ctx: Context, namespace: builder.SpecNamespace) -> None:
335
335
 
336
336
 
337
337
  def _validate_supports_handler_generation(
338
- stype: builder.SpecTypeDefn, name: str
338
+ stype: builder.SpecTypeDefn, name: str, supports_inheritance: bool = False
339
339
  ) -> builder.SpecTypeDefnObject:
340
340
  assert isinstance(
341
341
  stype, builder.SpecTypeDefnObject
342
342
  ), f"External api {name} must be an object"
343
- assert (
344
- stype.base is None or stype.base.is_base
345
- ), f"Inheritance not supporterd in external api {name}"
343
+ if not supports_inheritance:
344
+ assert (
345
+ stype.base is None or stype.base.is_base
346
+ ), f"Inheritance not supported in external api {name}"
346
347
  return stype
347
348
 
348
349
 
@@ -359,7 +360,9 @@ def _emit_endpoint_invocation_function(
359
360
  data_type = namespace.types["Data"]
360
361
 
361
362
  arguments_type = _validate_supports_handler_generation(arguments_type, "arguments")
362
- data_type = _validate_supports_handler_generation(data_type, "response")
363
+ data_type = _validate_supports_handler_generation(
364
+ data_type, "response", supports_inheritance=True
365
+ )
363
366
 
364
367
  endpoint_method_stype = builder.SpecTypeDefnObject(
365
368
  namespace=arguments_type.namespace, name=ENDPOINT_METHOD
@@ -13,9 +13,10 @@ class OpenAPIType(ABC):
13
13
  self.nullable = nullable
14
14
 
15
15
  @abstractmethod
16
- def asdict(self) -> dict[str, object]: ...
16
+ def asdict(self) -> dict[str, object]:
17
+ pass
17
18
 
18
- def asarguments(self) -> list[dict[str, object]]:
19
+ def asarguments(self) -> dict[str, dict[str, object]]:
19
20
  raise UnsupportedOperation
20
21
 
21
22
  def add_addl_info(self, emitted: dict[str, object]) -> dict[str, object]:
@@ -147,8 +148,8 @@ class OpenAPIFreeFormObjectType(OpenAPIType):
147
148
  def asdict(self) -> dict[str, object]:
148
149
  return self.add_addl_info({"type": "object"})
149
150
 
150
- def asarguments(self) -> list[dict[str, object]]:
151
- return []
151
+ def asarguments(self) -> dict[str, dict[str, object]]:
152
+ return {}
152
153
 
153
154
 
154
155
  class OpenAPIObjectType(OpenAPIType):
@@ -185,17 +186,17 @@ class OpenAPIObjectType(OpenAPIType):
185
186
  },
186
187
  })
187
188
 
188
- def asarguments(self) -> list[dict[str, object]]:
189
- argument_types: list[dict[str, object]] = []
189
+ def asarguments(self) -> dict[str, dict[str, object]]:
190
+ argument_types: dict[str, dict[str, object]] = {}
190
191
  for property_name, property_type in self.properties.items():
191
192
  desc = self.property_desc.get(property_name)
192
- argument_types.append({
193
+ argument_types[property_name] = {
193
194
  "name": property_name,
194
195
  "in": "query",
195
196
  "schema": property_type.asdict(),
196
197
  "required": not property_type.nullable,
197
198
  "description": desc or "",
198
- })
199
+ }
199
200
  return argument_types
200
201
 
201
202
 
@@ -219,11 +220,11 @@ class OpenAPIUnionType(OpenAPIType):
219
220
  # TODO: use parents description and nullable
220
221
  return {"oneOf": [base_type.asdict() for base_type in self.base_types]}
221
222
 
222
- def asarguments(self) -> list[dict[str, object]]:
223
+ def asarguments(self) -> dict[str, dict[str, object]]:
223
224
  # TODO handle inheritence (allOf and refs); need to inline here...
224
225
  # for now skip this endpoint
225
226
 
226
- return []
227
+ return {}
227
228
 
228
229
 
229
230
  class OpenAPIIntersectionType(OpenAPIType):
@@ -246,8 +247,8 @@ class OpenAPIIntersectionType(OpenAPIType):
246
247
  # TODO: use parents description and nullable
247
248
  return {"allOf": [base_type.asdict() for base_type in self.base_types]}
248
249
 
249
- def asarguments(self) -> list[dict[str, object]]:
250
+ def asarguments(self) -> dict[str, dict[str, object]]:
250
251
  # TODO handle inheritence (allOf and refs); need to inline here...
251
252
  # for now skip this endpoint
252
253
 
253
- return []
254
+ return {}
@@ -48,7 +48,9 @@ keywords = [ "uncountable", "sdk", "api", "uncountable-sdk" ]
48
48
  requires-python = ">=3.11"
49
49
  # May be compatible with older versions
50
50
  dependencies = [
51
- "requests >= 2.31.0",
51
+ "requests == 2.31.0",
52
+ "SQLAlchemy == 2.0.29",
53
+ "APScheduler == 3.10.4",
52
54
  ]
53
55
  dynamic = ["version"]
54
56
 
@@ -16,7 +16,7 @@ Arguments:
16
16
  type: Object
17
17
  properties:
18
18
  definition_id:
19
- type: Integer
19
+ type: ObjectId
20
20
  desc: "Definition id for the entities to create"
21
21
  entity_type:
22
22
  type: Union<Literal<entity.EntityType.lab_request>, Literal<entity.EntityType.approval>, Literal<entity.EntityType.custom_entity>, Literal<entity.EntityType.task>, Literal<entity.EntityType.project>>
@@ -23,7 +23,7 @@ Arguments:
23
23
  type: Object
24
24
  properties:
25
25
  definition_id:
26
- type: Integer
26
+ type: ObjectId
27
27
  desc: "Definition id of the entity to create"
28
28
  entity_type:
29
29
  type: Union<Literal<entity.EntityType.lab_request>, Literal<entity.EntityType.approval>, Literal<entity.EntityType.custom_entity>, Literal<entity.EntityType.task>, Literal<entity.EntityType.project>>
@@ -0,0 +1,29 @@
1
+ $endpoint:
2
+ is_sdk: true
3
+ method: get
4
+ path: ${external}/entity/external_get_entities_data
5
+ function: main.site.app.external.entity.get_entities_data.get_entities_data
6
+ desc: "Gets the details for a passed entity"
7
+ Arguments:
8
+ type: Object
9
+ properties:
10
+ entity_ids:
11
+ type: List<ObjectId>
12
+ desc: "Ids of the entity to retrieve"
13
+ entity_type:
14
+ type: entity.EntityType
15
+ desc: "The type of the entities requested, e.g. lab_request or approval"
16
+
17
+ EntityDetails:
18
+ type: Object
19
+ properties:
20
+ entity:
21
+ type: entity.Entity
22
+ field_values:
23
+ type: List<field_values.FieldRefIdNameValue>
24
+
25
+ Data:
26
+ type: Object
27
+ properties:
28
+ entity_details:
29
+ type: List<EntityDetails>
@@ -8,7 +8,7 @@ Arguments:
8
8
  type: Object
9
9
  properties:
10
10
  entity_type:
11
- type: String
11
+ type: entity.EntityType
12
12
  desc: "The type of the entities requested, e.g. lab_request, recipe"
13
13
  config_reference:
14
14
  type: String
@@ -16,28 +16,18 @@ Arguments:
16
16
  attributes?:
17
17
  type: Dict<OpaqueKey, JsonValue>
18
18
  desc: "Attributes to pass to the configuration for parameterizing filters"
19
- offset:
19
+ offset?:
20
20
  type: Optional<Integer>
21
21
  desc: "Used for pagination. Pagination is done based on the sorting of the config"
22
- limit:
22
+ limit?:
23
23
  type: Optional<Integer>
24
24
  desc: "The number of data points to return. If not filled in, it will be set to 100, and cannot be set higher than 100"
25
25
 
26
- Entity:
27
- type: Object
28
- properties:
29
- id:
30
- type: Integer
31
- desc: "A unique identifier for the entity. Used in conjunction with entity type"
32
- type:
33
- type: String
34
- desc: "The type of entity"
35
-
36
26
  EntityResult:
37
27
  type: Object
38
28
  properties:
39
29
  entity:
40
- type: Entity
30
+ type: entity.Entity
41
31
  desc: "The entity represented by the record"
42
32
  column_values:
43
33
  type: List<JsonValue>
@@ -8,10 +8,10 @@ Arguments:
8
8
  type: Object
9
9
  properties:
10
10
  entity_ids:
11
- type: List<Union<String, Integer>>
11
+ type: List<Union<String, ObjectId>>
12
12
  desc: "Ids of the entity to retrieve"
13
13
  entity_type:
14
- type: String
14
+ type: entity.EntityType
15
15
  desc: "The type of the entities requested"
16
16
 
17
17
  EntityNames:
@@ -0,0 +1,18 @@
1
+ $endpoint:
2
+ is_sdk: true
3
+ method: post
4
+ path: ${external}/entity/external_set_values
5
+ function: main.site.app.external.entity.set_values.set_values
6
+ desc: "Sets field values for an entity"
7
+
8
+ Arguments:
9
+ type: Object
10
+ properties:
11
+ entity:
12
+ type: entity.Entity
13
+ values:
14
+ type: List<field_values.ArgumentValueRefName>
15
+
16
+ Data:
17
+ type: response.Response
18
+ properties:
@@ -9,14 +9,14 @@ Arguments:
9
9
  type: Object
10
10
  properties:
11
11
  material_family_id:
12
- type: Integer
12
+ type: ObjectId
13
13
  desc: "Required: The Material Family ID to get the input groups from."
14
14
 
15
15
  SimpleInputGroup:
16
16
  type: Object
17
17
  properties:
18
18
  input_group_id:
19
- type: Integer
19
+ type: ObjectId
20
20
  desc: "The unique integer ID of the input group. Used for joining and identification elsewhere"
21
21
  name:
22
22
  type: String
@@ -19,39 +19,26 @@ InputToCreate:
19
19
  name:
20
20
  type: String
21
21
  material_family_ids:
22
- type: List<Integer>
22
+ type: List<ObjectId>
23
23
  desc: "The list of material families to add the ingredient to. This must be non-empty"
24
24
  quantity_type:
25
- type: Union<Literal<'numeric'>, Literal<'text'>>
25
+ type: Union<Literal<inputs.IngredientQuantityType.numeric>, Literal<inputs.IngredientQuantityType.text>>
26
26
  desc: "The quantity type of the input. Always numeric for standard inputs"
27
27
  type:
28
- type: Union<Literal<'ingredient'>, Literal<'process_parameter'>>
28
+ type: Union<Literal<inputs.IngredientType.ingredient>, Literal<inputs.IngredientType.process_parameter>>
29
29
  desc: "The type of the input, E.g. ingredient, process parameter"
30
30
  attributes?:
31
- type: List<InputAttributeValue>
31
+ type: List<input_attributes.InputAttributeValue>
32
32
  desc: "The attributes of the input"
33
33
  category_id?:
34
- type: Integer
34
+ type: ObjectId
35
35
  desc: The unique identifier for the category to set for the input
36
36
 
37
- InputAttributeValue:
38
- type: Object
39
- properties:
40
- attribute_id:
41
- type: Integer
42
- desc: "A unique identifier for the attribute."
43
- quantity_dec?:
44
- type: Decimal
45
- desc: "The value for the metadata, if it is of numeric type"
46
- quantity_json?:
47
- type: JsonValue
48
- desc: "The value for the metadata, if it is not of numeric type"
49
-
50
37
  InputSimple:
51
38
  type: Object
52
39
  properties:
53
40
  input_id:
54
- type: Integer
41
+ type: ObjectId
55
42
  desc: "A unique identifier for the id"
56
43
 
57
44
  Data:
@@ -9,39 +9,26 @@ Arguments:
9
9
  type: Object
10
10
  properties:
11
11
  material_family_id:
12
- type: Integer
12
+ type: ObjectId
13
13
  desc: "The material family ID to get the input values from."
14
14
  input_ids:
15
- type: Optional<List<Integer>>
15
+ type: Optional<List<ObjectId>>
16
16
  desc: "The input IDs to get the data from. If this is not filled in, all inputs from a material family will be returned (in paginated form)."
17
- offset:
17
+ offset?:
18
18
  type: Optional<Integer>
19
19
  desc: "Used for pagination, where the number of results returned exceeds the limit. Results are always ordered by the input ID"
20
20
  is_parameter:
21
21
  type: Optional<Boolean>
22
22
  desc: "Whether to get parameters or ingredients. By default both are returned. When set to true, only parameters are returned, and when set to false, only ingredients are returned"
23
- limit:
23
+ limit?:
24
24
  type: Optional<Integer>
25
25
  desc: "The maximum number of results to return. By default this is set to 1,000 and it cannot be set higher than 1,000"
26
26
 
27
- InputAttrVal:
28
- type: Object
29
- properties:
30
- attribute_id:
31
- type: Integer
32
- desc: "The unique integer ID for the input attribute value. Used for joining and identification elsewhere."
33
- quantity_dec:
34
- type: Decimal
35
- desc: "The value for the attribute, if it is of numeric type"
36
- quantity_json:
37
- type: JsonValue
38
- desc: "The value for the attribute, if it is not of numeric type"
39
-
40
27
  SimpleInputAttr:
41
28
  type: Object
42
29
  properties:
43
30
  attribute_id:
44
- type: Integer
31
+ type: ObjectId
45
32
  desc: "The unique integer ID for the input attribute value. Used for joining and identification elsewhere."
46
33
  name:
47
34
  type: String
@@ -54,7 +41,7 @@ SimpleInputGlobalCategory:
54
41
  type: Object
55
42
  properties:
56
43
  category_id:
57
- type: Integer
44
+ type: ObjectId
58
45
  desc: "The unique integer ID for the global category. Used for joining and identification elsewhere."
59
46
  name:
60
47
  type: String
@@ -64,7 +51,7 @@ SimpleInputSubcategory:
64
51
  type: Object
65
52
  properties:
66
53
  subcategory_id:
67
- type: Integer
54
+ type: ObjectId
68
55
  desc: "The unique integer ID for the subcategory. Used for joining and identification elsewhere."
69
56
  name:
70
57
  type: String
@@ -74,7 +61,7 @@ FullInput:
74
61
  type: Object
75
62
  properties:
76
63
  input_id:
77
- type: Integer
64
+ type: ObjectId
78
65
  desc: "The unique integer ID of the input value. Used for joining and identification elsewhere"
79
66
  name:
80
67
  type: String
@@ -86,13 +73,13 @@ FullInput:
86
73
  type: Boolean
87
74
  desc: "Whether the input is a process parameter (true) or an ingredient (false)"
88
75
  attributes:
89
- type: List<InputAttrVal>
76
+ type: List<input_attributes.InputAttributeValue>
90
77
  desc: "Attributes associated with an input, such as CAS number, density, etc."
91
78
  global_category_id:
92
- type: Integer
79
+ type: Optional<ObjectId>
93
80
  desc: "The global category ID associated with the input"
94
81
  subcategory_ids:
95
- type: List<Integer>
82
+ type: List<ObjectId>
96
83
  desc: "The subcategory IDs associated with an input. Inputs can be placed into an unlimited number of subcategories"
97
84
 
98
85
  Data:
@@ -9,15 +9,15 @@ Arguments:
9
9
  type: Object
10
10
  properties:
11
11
  material_family_id:
12
- type: Integer
12
+ type: ObjectId
13
13
  desc: "The material family ID to get the input values from"
14
- offset:
14
+ offset?:
15
15
  type: Optional<Integer>
16
16
  desc: "Used for pagination, where the number of results returned exceeds the limit. Results are always ordered by the input ID"
17
17
  is_parameter:
18
18
  type: Optional<Boolean>
19
19
  desc: "Whether to get parameters or ingredients. By default both are returned. When set to true, only parameters are returned, and when set to false, only ingredients are returned"
20
- limit:
20
+ limit?:
21
21
  type: Optional<Integer>
22
22
  desc: "The maximum number of results to return. By default this is set to 20,000 and it cannot be set higher than 20,000"
23
23
 
@@ -25,7 +25,7 @@ InputWithName:
25
25
  type: Object
26
26
  properties:
27
27
  input_id:
28
- type: Integer
28
+ type: ObjectId
29
29
  desc: "The unique integer ID of the input value. Used for joining and identification elsewhere"
30
30
  name:
31
31
  type: String