digitalhub 0.8.1__tar.gz → 0.9.0__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 digitalhub might be problematic. Click here for more details.

Files changed (265) hide show
  1. {digitalhub-0.8.1 → digitalhub-0.9.0}/LICENSE.txt +1 -1
  2. {digitalhub-0.8.1 → digitalhub-0.9.0}/PKG-INFO +3 -3
  3. {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/__init__.py +19 -2
  4. digitalhub-0.9.0/digitalhub/client/_base/api_builder.py +16 -0
  5. digitalhub-0.9.0/digitalhub/client/_base/client.py +123 -0
  6. digitalhub-0.9.0/digitalhub/client/_base/key_builder.py +52 -0
  7. digitalhub-0.9.0/digitalhub/client/api.py +27 -0
  8. digitalhub-0.9.0/digitalhub/client/dhcore/api_builder.py +100 -0
  9. {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/client/dhcore/client.py +81 -25
  10. digitalhub-0.9.0/digitalhub/client/dhcore/enums.py +27 -0
  11. {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/client/dhcore/env.py +2 -2
  12. digitalhub-0.9.0/digitalhub/client/dhcore/key_builder.py +58 -0
  13. {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/client/dhcore/utils.py +17 -17
  14. digitalhub-0.9.0/digitalhub/client/local/api_builder.py +100 -0
  15. {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/client/local/client.py +22 -0
  16. digitalhub-0.9.0/digitalhub/client/local/key_builder.py +58 -0
  17. {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/context/api.py +3 -38
  18. {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/context/builder.py +10 -23
  19. digitalhub-0.9.0/digitalhub/context/context.py +64 -0
  20. {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/_base/context/entity.py +30 -22
  21. {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/_base/entity/_constructors/metadata.py +12 -1
  22. {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/_base/entity/_constructors/name.py +1 -1
  23. {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/_base/entity/_constructors/spec.py +1 -1
  24. {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/_base/entity/_constructors/status.py +3 -2
  25. {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/_base/entity/builder.py +6 -1
  26. {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/_base/entity/entity.py +32 -10
  27. {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/_base/entity/metadata.py +22 -0
  28. {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/_base/entity/spec.py +7 -2
  29. {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/_base/executable/entity.py +8 -8
  30. {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/_base/material/entity.py +49 -17
  31. digitalhub-0.9.0/digitalhub/entities/_base/material/status.py +18 -0
  32. digitalhub-0.9.0/digitalhub/entities/_base/material/utils.py +106 -0
  33. digitalhub-0.9.0/digitalhub/entities/_base/project/entity.py +341 -0
  34. digitalhub-0.9.0/digitalhub/entities/_base/unversioned/entity.py +28 -0
  35. digitalhub-0.9.0/digitalhub/entities/_base/versioned/entity.py +29 -0
  36. digitalhub-0.9.0/digitalhub/entities/_commons/enums.py +103 -0
  37. digitalhub-0.9.0/digitalhub/entities/_commons/utils.py +83 -0
  38. digitalhub-0.9.0/digitalhub/entities/_operations/processor.py +1873 -0
  39. {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/artifact/_base/builder.py +1 -1
  40. {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/artifact/_base/entity.py +1 -1
  41. {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/artifact/artifact/builder.py +2 -1
  42. {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/artifact/crud.py +46 -29
  43. digitalhub-0.9.0/digitalhub/entities/artifact/utils.py +62 -0
  44. {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/dataitem/_base/builder.py +1 -1
  45. {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/dataitem/_base/entity.py +6 -6
  46. {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/dataitem/crud.py +50 -66
  47. {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/dataitem/dataitem/builder.py +2 -1
  48. {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/dataitem/iceberg/builder.py +2 -1
  49. {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/dataitem/table/builder.py +2 -1
  50. {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/dataitem/table/entity.py +5 -10
  51. {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/dataitem/table/models.py +4 -5
  52. digitalhub-0.9.0/digitalhub/entities/dataitem/utils.py +137 -0
  53. {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/function/_base/builder.py +1 -1
  54. {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/function/_base/entity.py +6 -2
  55. {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/function/crud.py +36 -17
  56. {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/model/_base/builder.py +1 -1
  57. {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/model/_base/entity.py +1 -1
  58. {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/model/crud.py +46 -29
  59. {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/model/huggingface/builder.py +2 -1
  60. {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/model/huggingface/spec.py +4 -2
  61. {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/model/mlflow/builder.py +2 -1
  62. digitalhub-0.9.0/digitalhub/entities/model/mlflow/models.py +34 -0
  63. {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/model/mlflow/spec.py +6 -1
  64. {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/model/mlflow/utils.py +4 -2
  65. {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/model/model/builder.py +2 -1
  66. {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/model/sklearn/builder.py +2 -1
  67. digitalhub-0.9.0/digitalhub/entities/model/utils.py +62 -0
  68. {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/project/_base/builder.py +2 -2
  69. {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/project/_base/entity.py +82 -272
  70. {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/project/crud.py +110 -91
  71. digitalhub-0.9.0/digitalhub/entities/project/utils.py +35 -0
  72. {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/run/_base/builder.py +3 -1
  73. {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/run/_base/entity.py +52 -54
  74. {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/run/_base/spec.py +15 -7
  75. {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/run/crud.py +35 -17
  76. {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/secret/_base/builder.py +2 -2
  77. {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/secret/_base/entity.py +4 -10
  78. {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/secret/crud.py +36 -21
  79. {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/task/_base/builder.py +14 -14
  80. {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/task/_base/entity.py +21 -14
  81. {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/task/_base/models.py +35 -6
  82. digitalhub-0.9.0/digitalhub/entities/task/_base/spec.py +90 -0
  83. digitalhub-0.9.0/digitalhub/entities/task/_base/utils.py +18 -0
  84. {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/task/crud.py +35 -15
  85. {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/workflow/_base/builder.py +1 -1
  86. {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/workflow/_base/entity.py +22 -6
  87. {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/workflow/crud.py +36 -17
  88. {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/factory/utils.py +1 -1
  89. {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/readers/_base/reader.py +2 -2
  90. digitalhub-0.9.0/digitalhub/readers/_commons/enums.py +13 -0
  91. {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/readers/api.py +3 -2
  92. {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/readers/factory.py +12 -6
  93. {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/readers/pandas/reader.py +20 -8
  94. {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/runtimes/_base.py +0 -7
  95. digitalhub-0.9.0/digitalhub/runtimes/enums.py +12 -0
  96. {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/stores/_base/store.py +59 -11
  97. {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/stores/builder.py +5 -5
  98. {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/stores/local/store.py +43 -4
  99. {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/stores/remote/store.py +31 -5
  100. {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/stores/s3/store.py +129 -48
  101. {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/stores/sql/store.py +122 -47
  102. {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/utils/exceptions.py +6 -0
  103. {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/utils/file_utils.py +60 -2
  104. {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/utils/generic_utils.py +45 -4
  105. {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/utils/io_utils.py +18 -0
  106. {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/utils/s3_utils.py +17 -0
  107. digitalhub-0.9.0/digitalhub/utils/uri_utils.py +194 -0
  108. {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub.egg-info/PKG-INFO +3 -3
  109. {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub.egg-info/SOURCES.txt +25 -23
  110. {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub.egg-info/requires.txt +1 -1
  111. {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub.egg-info/top_level.txt +0 -1
  112. {digitalhub-0.8.1 → digitalhub-0.9.0}/pyproject.toml +3 -3
  113. digitalhub-0.9.0/test/local/instances/test_validate.py +55 -0
  114. {digitalhub-0.8.1 → digitalhub-0.9.0}/test/testkfp.py +4 -1
  115. digitalhub-0.8.1/digitalhub/client/_base/client.py +0 -56
  116. digitalhub-0.8.1/digitalhub/client/api.py +0 -63
  117. digitalhub-0.8.1/digitalhub/context/context.py +0 -136
  118. digitalhub-0.8.1/digitalhub/datastores/_base/datastore.py +0 -85
  119. digitalhub-0.8.1/digitalhub/datastores/api.py +0 -37
  120. digitalhub-0.8.1/digitalhub/datastores/builder.py +0 -110
  121. digitalhub-0.8.1/digitalhub/datastores/local/datastore.py +0 -50
  122. digitalhub-0.8.1/digitalhub/datastores/remote/datastore.py +0 -31
  123. digitalhub-0.8.1/digitalhub/datastores/s3/datastore.py +0 -46
  124. digitalhub-0.8.1/digitalhub/datastores/sql/datastore.py +0 -68
  125. digitalhub-0.8.1/digitalhub/entities/_base/api_utils.py +0 -620
  126. digitalhub-0.8.1/digitalhub/entities/_base/crud.py +0 -468
  127. digitalhub-0.8.1/digitalhub/entities/_base/material/status.py +0 -49
  128. digitalhub-0.8.1/digitalhub/entities/_base/unversioned/entity.py +0 -49
  129. digitalhub-0.8.1/digitalhub/entities/_base/versioned/entity.py +0 -53
  130. digitalhub-0.8.1/digitalhub/entities/function/_base/models.py +0 -118
  131. digitalhub-0.8.1/digitalhub/entities/model/mlflow/models.py +0 -26
  132. digitalhub-0.8.1/digitalhub/entities/task/_base/spec.py +0 -53
  133. digitalhub-0.8.1/digitalhub/entities/utils/api.py +0 -346
  134. digitalhub-0.8.1/digitalhub/entities/utils/entity_types.py +0 -19
  135. digitalhub-0.8.1/digitalhub/entities/utils/state.py +0 -31
  136. digitalhub-0.8.1/digitalhub/entities/utils/utils.py +0 -202
  137. digitalhub-0.8.1/digitalhub/stores/remote/__init__.py +0 -0
  138. digitalhub-0.8.1/digitalhub/stores/s3/__init__.py +0 -0
  139. digitalhub-0.8.1/digitalhub/stores/sql/__init__.py +0 -0
  140. digitalhub-0.8.1/digitalhub/utils/__init__.py +0 -0
  141. digitalhub-0.8.1/digitalhub/utils/uri_utils.py +0 -56
  142. {digitalhub-0.8.1 → digitalhub-0.9.0}/README.md +0 -0
  143. {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/client/__init__.py +0 -0
  144. {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/client/_base/__init__.py +0 -0
  145. {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/client/builder.py +0 -0
  146. {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/client/dhcore/__init__.py +0 -0
  147. {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/client/dhcore/models.py +0 -0
  148. {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/client/local/__init__.py +0 -0
  149. {digitalhub-0.8.1/digitalhub/context → digitalhub-0.9.0/digitalhub/entities}/__init__.py +0 -0
  150. {digitalhub-0.8.1/digitalhub/datastores → digitalhub-0.9.0/digitalhub/entities/_base}/__init__.py +0 -0
  151. {digitalhub-0.8.1/digitalhub/datastores → digitalhub-0.9.0/digitalhub/entities/_base}/_base/__init__.py +0 -0
  152. {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/_base/_base/entity.py +0 -0
  153. {digitalhub-0.8.1/digitalhub/datastores/local → digitalhub-0.9.0/digitalhub/entities/_base/context}/__init__.py +0 -0
  154. {digitalhub-0.8.1/digitalhub/datastores/remote → digitalhub-0.9.0/digitalhub/entities/_base/entity}/__init__.py +0 -0
  155. {digitalhub-0.8.1/digitalhub/datastores/s3 → digitalhub-0.9.0/digitalhub/entities/_base/entity/_constructors}/__init__.py +0 -0
  156. {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/_base/entity/_constructors/uuid.py +0 -0
  157. {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/_base/entity/status.py +0 -0
  158. {digitalhub-0.8.1/digitalhub/datastores/sql → digitalhub-0.9.0/digitalhub/entities/_base/executable}/__init__.py +0 -0
  159. {digitalhub-0.8.1/digitalhub/entities → digitalhub-0.9.0/digitalhub/entities/_base/material}/__init__.py +0 -0
  160. {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/_base/material/spec.py +0 -0
  161. {digitalhub-0.8.1/digitalhub/entities/_base → digitalhub-0.9.0/digitalhub/entities/_base/project}/__init__.py +0 -0
  162. {digitalhub-0.8.1/digitalhub/entities/_base/_base → digitalhub-0.9.0/digitalhub/entities/_base/runtime_entity}/__init__.py +0 -0
  163. {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/_base/runtime_entity/builder.py +0 -0
  164. {digitalhub-0.8.1/digitalhub/entities/_base/context → digitalhub-0.9.0/digitalhub/entities/_base/unversioned}/__init__.py +0 -0
  165. {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/_base/unversioned/builder.py +0 -0
  166. {digitalhub-0.8.1/digitalhub/entities/_base/entity → digitalhub-0.9.0/digitalhub/entities/_base/versioned}/__init__.py +0 -0
  167. {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/_base/versioned/builder.py +0 -0
  168. {digitalhub-0.8.1/digitalhub/entities/_base/entity/_constructors → digitalhub-0.9.0/digitalhub/entities/_commons}/__init__.py +0 -0
  169. {digitalhub-0.8.1/digitalhub/entities/_base/executable → digitalhub-0.9.0/digitalhub/entities/_operations}/__init__.py +0 -0
  170. {digitalhub-0.8.1/digitalhub/entities/_base/material → digitalhub-0.9.0/digitalhub/entities/artifact}/__init__.py +0 -0
  171. {digitalhub-0.8.1/digitalhub/entities/_base/runtime_entity → digitalhub-0.9.0/digitalhub/entities/artifact/_base}/__init__.py +0 -0
  172. {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/artifact/_base/spec.py +0 -0
  173. {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/artifact/_base/status.py +0 -0
  174. {digitalhub-0.8.1/digitalhub/entities/_base/unversioned → digitalhub-0.9.0/digitalhub/entities/artifact/artifact}/__init__.py +0 -0
  175. {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/artifact/artifact/entity.py +0 -0
  176. {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/artifact/artifact/spec.py +0 -0
  177. {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/artifact/artifact/status.py +0 -0
  178. {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/builders.py +0 -0
  179. {digitalhub-0.8.1/digitalhub/entities/_base/versioned → digitalhub-0.9.0/digitalhub/entities/dataitem}/__init__.py +0 -0
  180. {digitalhub-0.8.1/digitalhub/entities/artifact → digitalhub-0.9.0/digitalhub/entities/dataitem/_base}/__init__.py +0 -0
  181. {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/dataitem/_base/spec.py +0 -0
  182. {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/dataitem/_base/status.py +0 -0
  183. {digitalhub-0.8.1/digitalhub/entities/artifact/_base → digitalhub-0.9.0/digitalhub/entities/dataitem/dataitem}/__init__.py +0 -0
  184. {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/dataitem/dataitem/entity.py +0 -0
  185. {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/dataitem/dataitem/spec.py +0 -0
  186. {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/dataitem/dataitem/status.py +0 -0
  187. {digitalhub-0.8.1/digitalhub/entities/artifact/artifact → digitalhub-0.9.0/digitalhub/entities/dataitem/iceberg}/__init__.py +0 -0
  188. {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/dataitem/iceberg/entity.py +0 -0
  189. {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/dataitem/iceberg/spec.py +0 -0
  190. {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/dataitem/iceberg/status.py +0 -0
  191. {digitalhub-0.8.1/digitalhub/entities/dataitem → digitalhub-0.9.0/digitalhub/entities/dataitem/table}/__init__.py +0 -0
  192. {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/dataitem/table/spec.py +0 -0
  193. {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/dataitem/table/status.py +0 -0
  194. {digitalhub-0.8.1/digitalhub/entities/dataitem/_base → digitalhub-0.9.0/digitalhub/entities/function}/__init__.py +0 -0
  195. {digitalhub-0.8.1/digitalhub/entities/dataitem/dataitem → digitalhub-0.9.0/digitalhub/entities/function/_base}/__init__.py +0 -0
  196. {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/function/_base/spec.py +0 -0
  197. {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/function/_base/status.py +0 -0
  198. {digitalhub-0.8.1/digitalhub/entities/dataitem/iceberg → digitalhub-0.9.0/digitalhub/entities/model}/__init__.py +0 -0
  199. {digitalhub-0.8.1/digitalhub/entities/dataitem/table → digitalhub-0.9.0/digitalhub/entities/model/_base}/__init__.py +0 -0
  200. {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/model/_base/spec.py +0 -0
  201. {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/model/_base/status.py +0 -0
  202. {digitalhub-0.8.1/digitalhub/entities/function → digitalhub-0.9.0/digitalhub/entities/model/huggingface}/__init__.py +0 -0
  203. {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/model/huggingface/entity.py +0 -0
  204. {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/model/huggingface/status.py +0 -0
  205. {digitalhub-0.8.1/digitalhub/entities/function/_base → digitalhub-0.9.0/digitalhub/entities/model/mlflow}/__init__.py +0 -0
  206. {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/model/mlflow/entity.py +0 -0
  207. {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/model/mlflow/status.py +0 -0
  208. {digitalhub-0.8.1/digitalhub/entities → digitalhub-0.9.0/digitalhub/entities/model}/model/__init__.py +0 -0
  209. {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/model/model/entity.py +0 -0
  210. {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/model/model/spec.py +0 -0
  211. {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/model/model/status.py +0 -0
  212. {digitalhub-0.8.1/digitalhub/entities/model/_base → digitalhub-0.9.0/digitalhub/entities/model/sklearn}/__init__.py +0 -0
  213. {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/model/sklearn/entity.py +0 -0
  214. {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/model/sklearn/spec.py +0 -0
  215. {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/model/sklearn/status.py +0 -0
  216. {digitalhub-0.8.1/digitalhub/entities/model/huggingface → digitalhub-0.9.0/digitalhub/entities/project}/__init__.py +0 -0
  217. {digitalhub-0.8.1/digitalhub/entities/model/mlflow → digitalhub-0.9.0/digitalhub/entities/project/_base}/__init__.py +0 -0
  218. {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/project/_base/spec.py +0 -0
  219. {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/project/_base/status.py +0 -0
  220. {digitalhub-0.8.1/digitalhub/entities/model/model → digitalhub-0.9.0/digitalhub/entities/run}/__init__.py +0 -0
  221. {digitalhub-0.8.1/digitalhub/entities/model/sklearn → digitalhub-0.9.0/digitalhub/entities/run/_base}/__init__.py +0 -0
  222. {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/run/_base/status.py +0 -0
  223. {digitalhub-0.8.1/digitalhub/entities/project → digitalhub-0.9.0/digitalhub/entities/secret}/__init__.py +0 -0
  224. {digitalhub-0.8.1/digitalhub/entities/project → digitalhub-0.9.0/digitalhub/entities/secret}/_base/__init__.py +0 -0
  225. {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/secret/_base/spec.py +0 -0
  226. {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/secret/_base/status.py +0 -0
  227. {digitalhub-0.8.1/digitalhub/entities/run → digitalhub-0.9.0/digitalhub/entities/task}/__init__.py +0 -0
  228. {digitalhub-0.8.1/digitalhub/entities/run → digitalhub-0.9.0/digitalhub/entities/task}/_base/__init__.py +0 -0
  229. {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/task/_base/status.py +0 -0
  230. {digitalhub-0.8.1/digitalhub/entities/secret → digitalhub-0.9.0/digitalhub/entities/workflow}/__init__.py +0 -0
  231. {digitalhub-0.8.1/digitalhub/entities/secret → digitalhub-0.9.0/digitalhub/entities/workflow}/_base/__init__.py +0 -0
  232. {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/workflow/_base/spec.py +0 -0
  233. {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/entities/workflow/_base/status.py +0 -0
  234. {digitalhub-0.8.1/digitalhub/entities/task → digitalhub-0.9.0/digitalhub/factory}/__init__.py +0 -0
  235. {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/factory/api.py +0 -0
  236. {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/factory/factory.py +0 -0
  237. {digitalhub-0.8.1/digitalhub/entities/task/_base → digitalhub-0.9.0/digitalhub/readers}/__init__.py +0 -0
  238. {digitalhub-0.8.1/digitalhub/entities/utils → digitalhub-0.9.0/digitalhub/readers/_base}/__init__.py +0 -0
  239. {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/readers/_base/builder.py +0 -0
  240. {digitalhub-0.8.1/digitalhub/entities/workflow → digitalhub-0.9.0/digitalhub/readers/_commons}/__init__.py +0 -0
  241. {digitalhub-0.8.1/digitalhub/entities/workflow/_base → digitalhub-0.9.0/digitalhub/readers/pandas}/__init__.py +0 -0
  242. {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/readers/pandas/builder.py +0 -0
  243. {digitalhub-0.8.1/digitalhub/factory → digitalhub-0.9.0/digitalhub/runtimes}/__init__.py +0 -0
  244. {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/runtimes/builder.py +0 -0
  245. {digitalhub-0.8.1/digitalhub/readers → digitalhub-0.9.0/digitalhub/stores}/__init__.py +0 -0
  246. {digitalhub-0.8.1/digitalhub/readers → digitalhub-0.9.0/digitalhub/stores}/_base/__init__.py +0 -0
  247. {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/stores/api.py +0 -0
  248. {digitalhub-0.8.1/digitalhub/readers/pandas → digitalhub-0.9.0/digitalhub/stores/local}/__init__.py +0 -0
  249. {digitalhub-0.8.1/digitalhub/runtimes → digitalhub-0.9.0/digitalhub/stores/remote}/__init__.py +0 -0
  250. {digitalhub-0.8.1/digitalhub/stores → digitalhub-0.9.0/digitalhub/stores/s3}/__init__.py +0 -0
  251. {digitalhub-0.8.1/digitalhub/stores/_base → digitalhub-0.9.0/digitalhub/stores/sql}/__init__.py +0 -0
  252. {digitalhub-0.8.1/digitalhub/stores/local → digitalhub-0.9.0/digitalhub/utils}/__init__.py +0 -0
  253. {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/utils/data_utils.py +0 -0
  254. {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/utils/git_utils.py +0 -0
  255. {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub/utils/logger.py +0 -0
  256. {digitalhub-0.8.1 → digitalhub-0.9.0}/digitalhub.egg-info/dependency_links.txt +0 -0
  257. {digitalhub-0.8.1 → digitalhub-0.9.0}/setup.cfg +0 -0
  258. {digitalhub-0.8.1 → digitalhub-0.9.0}/test/local/CRUD/test_artifacts.py +0 -0
  259. {digitalhub-0.8.1 → digitalhub-0.9.0}/test/local/CRUD/test_dataitems.py +0 -0
  260. {digitalhub-0.8.1 → digitalhub-0.9.0}/test/local/CRUD/test_models.py +0 -0
  261. {digitalhub-0.8.1 → digitalhub-0.9.0}/test/local/imports/test_imports.py +0 -0
  262. {digitalhub-0.8.1 → digitalhub-0.9.0}/test/test_crud_functions.py +0 -0
  263. {digitalhub-0.8.1 → digitalhub-0.9.0}/test/test_crud_runs.py +0 -0
  264. {digitalhub-0.8.1 → digitalhub-0.9.0}/test/test_crud_tasks.py +0 -0
  265. {digitalhub-0.8.1 → digitalhub-0.9.0}/test/testkfp_pipeline.py +0 -0
@@ -186,7 +186,7 @@ APPENDIX: How to apply the Apache License to your work.
186
186
  same "printed page" as the copyright notice for easier
187
187
  identification within third-party archives.
188
188
 
189
- Copyright [yyyy] [name of copyright owner]
189
+ Copyright 2024 DSLab, Fondazione Bruno Kessler
190
190
 
191
191
  Licensed under the Apache License, Version 2.0 (the "License");
192
192
  you may not use this file except in compliance with the License.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: digitalhub
3
- Version: 0.8.1
3
+ Version: 0.9.0
4
4
  Summary: Python SDK for Digitalhub
5
5
  Author-email: Fondazione Bruno Kessler <dslab@fbk.eu>, Matteo Martini <mmartini@fbk.eu>
6
6
  License: Apache License
@@ -191,7 +191,7 @@ License: Apache License
191
191
  same "printed page" as the copyright notice for easier
192
192
  identification within third-party archives.
193
193
 
194
- Copyright [yyyy] [name of copyright owner]
194
+ Copyright 2024 DSLab, Fondazione Bruno Kessler
195
195
 
196
196
  Licensed under the Apache License, Version 2.0 (the "License");
197
197
  you may not use this file except in compliance with the License.
@@ -230,7 +230,7 @@ Requires-Python: >=3.9
230
230
  Description-Content-Type: text/markdown
231
231
  License-File: LICENSE.txt
232
232
  Requires-Dist: boto3
233
- Requires-Dist: pydantic<2
233
+ Requires-Dist: pydantic
234
234
  Requires-Dist: sqlalchemy<2
235
235
  Requires-Dist: pyarrow
236
236
  Requires-Dist: numpy<2
@@ -1,9 +1,11 @@
1
+ __version__ = "0.9.0b0"
1
2
  from digitalhub.entities.artifact.crud import (
2
3
  delete_artifact,
3
4
  get_artifact,
4
5
  get_artifact_versions,
5
6
  import_artifact,
6
7
  list_artifacts,
8
+ load_artifact,
7
9
  log_artifact,
8
10
  new_artifact,
9
11
  update_artifact,
@@ -14,6 +16,7 @@ from digitalhub.entities.dataitem.crud import (
14
16
  get_dataitem_versions,
15
17
  import_dataitem,
16
18
  list_dataitems,
19
+ load_dataitem,
17
20
  log_dataitem,
18
21
  new_dataitem,
19
22
  update_dataitem,
@@ -24,6 +27,7 @@ from digitalhub.entities.function.crud import (
24
27
  get_function_versions,
25
28
  import_function,
26
29
  list_functions,
30
+ load_function,
27
31
  new_function,
28
32
  update_function,
29
33
  )
@@ -33,6 +37,7 @@ from digitalhub.entities.model.crud import (
33
37
  get_model_versions,
34
38
  import_model,
35
39
  list_models,
40
+ load_model,
36
41
  log_model,
37
42
  new_model,
38
43
  update_model,
@@ -42,27 +47,39 @@ from digitalhub.entities.project.crud import (
42
47
  get_or_create_project,
43
48
  get_project,
44
49
  import_project,
50
+ list_projects,
45
51
  load_project,
46
52
  new_project,
53
+ search_entity,
47
54
  update_project,
48
55
  )
49
- from digitalhub.entities.run.crud import delete_run, get_run, import_run, list_runs, new_run, update_run
56
+ from digitalhub.entities.run.crud import delete_run, get_run, import_run, list_runs, load_run, new_run, update_run
50
57
  from digitalhub.entities.secret.crud import (
51
58
  delete_secret,
52
59
  get_secret,
53
60
  get_secret_versions,
54
61
  import_secret,
55
62
  list_secrets,
63
+ load_secret,
56
64
  new_secret,
57
65
  update_secret,
58
66
  )
59
- from digitalhub.entities.task.crud import delete_task, get_task, import_task, list_tasks, new_task, update_task
67
+ from digitalhub.entities.task.crud import (
68
+ delete_task,
69
+ get_task,
70
+ import_task,
71
+ list_tasks,
72
+ load_task,
73
+ new_task,
74
+ update_task,
75
+ )
60
76
  from digitalhub.entities.workflow.crud import (
61
77
  delete_workflow,
62
78
  get_workflow,
63
79
  get_workflow_versions,
64
80
  import_workflow,
65
81
  list_workflows,
82
+ load_workflow,
66
83
  new_workflow,
67
84
  update_workflow,
68
85
  )
@@ -0,0 +1,16 @@
1
+ from __future__ import annotations
2
+
3
+ from abc import abstractmethod
4
+
5
+
6
+ class ClientApiBuilder:
7
+ """
8
+ This class is used to build the API for the client.
9
+ Depending on the client, the API is built differently.
10
+ """
11
+
12
+ @abstractmethod
13
+ def build_api(self) -> str:
14
+ """
15
+ Build the API for the client.
16
+ """
@@ -0,0 +1,123 @@
1
+ from __future__ import annotations
2
+
3
+ import typing
4
+ from abc import abstractmethod
5
+
6
+ if typing.TYPE_CHECKING:
7
+ from digitalhub.client._base.api_builder import ClientApiBuilder
8
+ from digitalhub.client._base.key_builder import ClientKeyBuilder
9
+
10
+
11
+ class Client:
12
+ """
13
+ Base Client class interface.
14
+
15
+ The client is an interface that handles the CRUD of an object during
16
+ a session. It manages the creation, reading, updating, deleting and
17
+ listing of objects and comes into two subclasses: Local and DHCore.
18
+ """
19
+
20
+ def __init__(self) -> None:
21
+ self._api_builder: ClientApiBuilder = None
22
+ self._key_builder: ClientKeyBuilder = None
23
+
24
+ ##############################
25
+ # CRUD methods
26
+ ##############################
27
+
28
+ @abstractmethod
29
+ def create_object(self, api: str, obj: dict, **kwargs) -> dict:
30
+ """
31
+ Create object method.
32
+ """
33
+
34
+ @abstractmethod
35
+ def read_object(self, api: str, **kwargs) -> dict:
36
+ """
37
+ Read object method.
38
+ """
39
+
40
+ @abstractmethod
41
+ def update_object(self, api: str, obj: dict, **kwargs) -> dict:
42
+ """
43
+ Update object method.
44
+ """
45
+
46
+ @abstractmethod
47
+ def delete_object(self, api: str, **kwargs) -> dict:
48
+ """
49
+ Delete object method.
50
+ """
51
+
52
+ @abstractmethod
53
+ def list_objects(self, api: str, **kwargs) -> dict:
54
+ """
55
+ List objects method.
56
+ """
57
+
58
+ @abstractmethod
59
+ def list_first_object(self, api: str, **kwargs) -> dict:
60
+ """
61
+ Read first object method.
62
+ """
63
+
64
+ @abstractmethod
65
+ def search_objects(self, api: str, **kwargs) -> dict:
66
+ """
67
+ Search objects method.
68
+ """
69
+
70
+ ##############################
71
+ # Build methods
72
+ ##############################
73
+
74
+ def build_api(self, category: str, operation: str, **kwargs) -> str:
75
+ """
76
+ Build the API for the client.
77
+
78
+ Parameters
79
+ ----------
80
+ category : str
81
+ API category.
82
+ operation : str
83
+ API operation.
84
+ **kwargs : dict
85
+ Additional parameters.
86
+
87
+ Returns
88
+ -------
89
+ str
90
+ API formatted.
91
+ """
92
+ return self._api_builder.build_api(category, operation, **kwargs)
93
+
94
+ def build_key(self, category: str, *args, **kwargs) -> str:
95
+ """
96
+ Build the key for the client.
97
+
98
+ Parameters
99
+ ----------
100
+ category : str
101
+ Key category.
102
+ *args : tuple
103
+ Additional arguments.
104
+ **kwargs : dict
105
+ Additional parameters.
106
+
107
+ Returns
108
+ -------
109
+ str
110
+ Key formatted.
111
+ """
112
+ return self._key_builder.build_key(category, *args, **kwargs)
113
+
114
+ ##############################
115
+ # Interface methods
116
+ ##############################
117
+
118
+ @staticmethod
119
+ @abstractmethod
120
+ def is_local() -> bool:
121
+ """
122
+ Flag to check if client is local.
123
+ """
@@ -0,0 +1,52 @@
1
+ from __future__ import annotations
2
+
3
+ from abc import abstractmethod
4
+
5
+ from digitalhub.entities._commons.enums import ApiCategories
6
+
7
+
8
+ class ClientKeyBuilder:
9
+ """
10
+ Class that build the key of entities.
11
+ """
12
+
13
+ def build_key(self, category: str, *args, **kwargs) -> str:
14
+ """
15
+ Build key.
16
+
17
+ Parameters
18
+ ----------
19
+ category : str
20
+ Key category.
21
+ *args : tuple
22
+ Positional arguments.
23
+ **kwargs : dict
24
+ Keyword arguments.
25
+
26
+ Returns
27
+ -------
28
+ str
29
+ Key.
30
+ """
31
+ if category == ApiCategories.BASE.value:
32
+ return self.base_entity_key(*args, **kwargs)
33
+ return self.context_entity_key(*args, **kwargs)
34
+
35
+ @abstractmethod
36
+ def base_entity_key(self, entity_id: str) -> str:
37
+ """
38
+ Build for base entity key.
39
+ """
40
+
41
+ @abstractmethod
42
+ def context_entity_key(
43
+ self,
44
+ project: str,
45
+ entity_type: str,
46
+ entity_kind: str,
47
+ entity_name: str,
48
+ entity_id: str | None = None,
49
+ ) -> str:
50
+ """
51
+ Build for context entity key.
52
+ """
@@ -0,0 +1,27 @@
1
+ from __future__ import annotations
2
+
3
+ import typing
4
+
5
+ from digitalhub.client.builder import client_builder
6
+
7
+ if typing.TYPE_CHECKING:
8
+ from digitalhub.client._base.client import Client
9
+
10
+
11
+ def get_client(local: bool = False, config: dict | None = None) -> Client:
12
+ """
13
+ Wrapper around ClientBuilder.build.
14
+
15
+ Parameters
16
+ ----------
17
+ local : bool
18
+ Whether to create a local client or not.
19
+ config : dict
20
+ DHCore environment configuration.
21
+
22
+ Returns
23
+ -------
24
+ Client
25
+ The client instance.
26
+ """
27
+ return client_builder.build(local, config)
@@ -0,0 +1,100 @@
1
+ from __future__ import annotations
2
+
3
+ from digitalhub.client._base.api_builder import ClientApiBuilder
4
+ from digitalhub.entities._commons.enums import ApiCategories, BackendOperations
5
+ from digitalhub.utils.exceptions import BackendError
6
+
7
+ API_BASE = "/api/v1"
8
+ API_CONTEXT = f"{API_BASE}/-"
9
+
10
+
11
+ class ClientDHCoreApiBuilder(ClientApiBuilder):
12
+ """
13
+ This class is used to build the API for the DHCore client.
14
+ """
15
+
16
+ def build_api(self, category: str, operation: str, **kwargs) -> str:
17
+ """
18
+ Build the API for the client.
19
+
20
+ Parameters
21
+ ----------
22
+ category : str
23
+ API category.
24
+ operation : str
25
+ API operation.
26
+ **kwargs : dict
27
+ Additional parameters.
28
+
29
+ Returns
30
+ -------
31
+ str
32
+ API formatted.
33
+ """
34
+ if category == ApiCategories.BASE.value:
35
+ return self.build_api_base(operation, **kwargs)
36
+ return self.build_api_context(operation, **kwargs)
37
+
38
+ def build_api_base(self, operation: str, **kwargs) -> str:
39
+ """
40
+ Build the base API for the client.
41
+
42
+ Parameters
43
+ ----------
44
+ operation : str
45
+ API operation.
46
+ **kwargs : dict
47
+ Additional parameters.
48
+
49
+ Returns
50
+ -------
51
+ str
52
+ API formatted.
53
+ """
54
+ entity_type = kwargs["entity_type"] + "s"
55
+ if operation in (
56
+ BackendOperations.CREATE.value,
57
+ BackendOperations.LIST.value,
58
+ ):
59
+ return f"{API_BASE}/{entity_type}"
60
+ elif operation in (
61
+ BackendOperations.READ.value,
62
+ BackendOperations.UPDATE.value,
63
+ BackendOperations.DELETE.value,
64
+ ):
65
+ return f"{API_BASE}/{entity_type}/{kwargs['entity_name']}"
66
+ elif operation == BackendOperations.SHARE.value:
67
+ return f"{API_BASE}/{entity_type}/{kwargs['entity_name']}/share"
68
+ raise BackendError(f"Invalid operation '{operation}' for entity type '{entity_type}' in DHCore.")
69
+
70
+ def build_api_context(self, operation: str, **kwargs) -> str:
71
+ """
72
+ Build the context API for the client.
73
+ """
74
+ entity_type = kwargs["entity_type"] + "s"
75
+ project = kwargs["project"]
76
+ if operation in (
77
+ BackendOperations.CREATE.value,
78
+ BackendOperations.LIST.value,
79
+ ):
80
+ return f"{API_CONTEXT}/{project}/{entity_type}"
81
+ elif operation in (
82
+ BackendOperations.READ.value,
83
+ BackendOperations.UPDATE.value,
84
+ BackendOperations.DELETE.value,
85
+ ):
86
+ return f"{API_CONTEXT}/{project}/{entity_type}/{kwargs['entity_id']}"
87
+ elif operation == BackendOperations.LOGS.value:
88
+ return f"{API_CONTEXT}/{project}/{entity_type}/{kwargs['entity_id']}/logs"
89
+ elif operation == BackendOperations.STOP.value:
90
+ return f"{API_CONTEXT}/{project}/{entity_type}/{kwargs['entity_id']}/stop"
91
+ elif operation == BackendOperations.RESUME.value:
92
+ return f"{API_CONTEXT}/{project}/{entity_type}/{kwargs['entity_id']}/resume"
93
+ elif operation == BackendOperations.DATA.value:
94
+ return f"{API_CONTEXT}/{project}/{entity_type}/{kwargs['entity_id']}/data"
95
+ elif operation == BackendOperations.FILES.value:
96
+ return f"{API_CONTEXT}/{project}/{entity_type}/{kwargs['entity_id']}/files/info"
97
+ elif operation == BackendOperations.SEARCH.value:
98
+ return f"{API_CONTEXT}/{project}/solr/search/item"
99
+
100
+ raise BackendError(f"Invalid operation '{operation}' for entity type '{entity_type}' in DHCore.")
@@ -4,7 +4,6 @@ import datetime
4
4
  import json
5
5
  import os
6
6
  import typing
7
- from urllib.parse import urlparse
8
7
  from warnings import warn
9
8
 
10
9
  from dotenv import get_key, set_key
@@ -12,7 +11,10 @@ from requests import request
12
11
  from requests.exceptions import HTTPError, JSONDecodeError, RequestException
13
12
 
14
13
  from digitalhub.client._base.client import Client
15
- from digitalhub.client.dhcore.env import ENV_FILE, FALLBACK_USER, MAX_API_LEVEL, MIN_API_LEVEL, LIB_VERSION
14
+ from digitalhub.client.dhcore.api_builder import ClientDHCoreApiBuilder
15
+ from digitalhub.client.dhcore.enums import AuthType, DhcoreEnvVar
16
+ from digitalhub.client.dhcore.env import ENV_FILE, FALLBACK_USER, LIB_VERSION, MAX_API_LEVEL, MIN_API_LEVEL
17
+ from digitalhub.client.dhcore.key_builder import ClientDHCoreKeyBuilder
16
18
  from digitalhub.client.dhcore.models import BasicAuth, OAuth2TokenAuth
17
19
  from digitalhub.utils.exceptions import (
18
20
  BackendError,
@@ -23,6 +25,7 @@ from digitalhub.utils.exceptions import (
23
25
  MissingSpecError,
24
26
  UnauthorizedError,
25
27
  )
28
+ from digitalhub.utils.uri_utils import has_remote_scheme
26
29
 
27
30
  if typing.TYPE_CHECKING:
28
31
  from requests import Response
@@ -47,6 +50,12 @@ class ClientDHCore(Client):
47
50
  def __init__(self, config: dict | None = None) -> None:
48
51
  super().__init__()
49
52
 
53
+ # API builder
54
+ self._api_builder = ClientDHCoreApiBuilder()
55
+
56
+ # Key builder
57
+ self._key_builder = ClientDHCoreKeyBuilder()
58
+
50
59
  # Endpoints
51
60
  self._endpoint_core: str | None = None
52
61
  self._endpoint_issuer: str | None = None
@@ -214,6 +223,56 @@ class ClientDHCore(Client):
214
223
  except IndexError:
215
224
  raise BackendError("No object found.")
216
225
 
226
+ def search_objects(self, api: str, **kwargs) -> list[dict]:
227
+ """
228
+ Search objects from DHCore.
229
+
230
+ Parameters
231
+ ----------
232
+ api : str
233
+ Search API.
234
+ **kwargs : dict
235
+ Keyword arguments to pass to the request.
236
+
237
+ Returns
238
+ -------
239
+ list[dict]
240
+ Response objects.
241
+ """
242
+ if kwargs is None:
243
+ kwargs = {}
244
+
245
+ if "params" not in kwargs:
246
+ kwargs["params"] = {}
247
+
248
+ start_page = 0
249
+ if "page" not in kwargs["params"]:
250
+ kwargs["params"]["page"] = start_page
251
+
252
+ if "size" not in kwargs["params"]:
253
+ kwargs["params"]["size"] = 10
254
+
255
+ # Add sorting
256
+ if "sort" not in kwargs["params"]:
257
+ kwargs["params"]["sort"] = "metadata.updated,DESC"
258
+
259
+ objects_with_highlights = []
260
+ while True:
261
+ resp = self._prepare_call("GET", api, **kwargs)
262
+ contents = resp["content"]
263
+ total_pages = resp["totalPages"]
264
+ if not contents or kwargs["params"]["page"] >= total_pages:
265
+ break
266
+ objects_with_highlights.extend(contents)
267
+ kwargs["params"]["page"] += 1
268
+
269
+ objects = []
270
+ for obj in objects_with_highlights:
271
+ obj.pop("highlights", None)
272
+ objects.append(obj)
273
+
274
+ return objects
275
+
217
276
  ##############################
218
277
  # Call methods
219
278
  ##############################
@@ -275,9 +334,9 @@ class ClientDHCore(Client):
275
334
  dict
276
335
  Keyword arguments with the authentication parameters.
277
336
  """
278
- if self._auth_type == "basic":
337
+ if self._auth_type == AuthType.BASIC.value:
279
338
  kwargs["auth"] = self._user, self._password
280
- elif self._auth_type == "oauth2":
339
+ elif self._auth_type == AuthType.OAUTH2.value:
281
340
  if "headers" not in kwargs:
282
341
  kwargs["headers"] = {}
283
342
  kwargs["headers"]["Authorization"] = f"Bearer {self._access_token}"
@@ -465,7 +524,6 @@ class ClientDHCore(Client):
465
524
  -------
466
525
  None
467
526
  """
468
-
469
527
  self._get_endpoints_from_env()
470
528
 
471
529
  if config is not None:
@@ -475,21 +533,20 @@ class ClientDHCore(Client):
475
533
  self._access_token = config.access_token
476
534
  self._refresh_token = config.refresh_token
477
535
  self._client_id = config.client_id
478
- self._auth_type = "oauth2"
536
+ self._auth_type = AuthType.OAUTH2.value
479
537
 
480
538
  elif config.get("user") is not None and config.get("password") is not None:
481
539
  config = BasicAuth(**config)
482
540
  self._user = config.user
483
541
  self._password = config.password
484
- self._auth_type = "basic"
542
+ self._auth_type = AuthType.BASIC.value
485
543
 
486
544
  return
487
545
 
488
546
  self._get_auth_from_env()
489
547
 
490
548
  # Propagate access and refresh token to env file
491
- if not ENV_FILE.exists():
492
- self._write_env()
549
+ self._write_env()
493
550
 
494
551
  def _get_endpoints_from_env(self) -> None:
495
552
  """
@@ -504,12 +561,12 @@ class ClientDHCore(Client):
504
561
  Exception
505
562
  If the endpoint of DHCore is not set in the env variables.
506
563
  """
507
- core_endpt = os.getenv("DHCORE_ENDPOINT")
564
+ core_endpt = os.getenv(DhcoreEnvVar.ENDPOINT.value)
508
565
  if core_endpt is None:
509
566
  raise BackendError("Endpoint not set as environment variables.")
510
567
  self._endpoint_core = self._sanitize_endpoint(core_endpt)
511
568
 
512
- issr_endpt = os.getenv("DHCORE_ISSUER")
569
+ issr_endpt = os.getenv(DhcoreEnvVar.ISSUER.value)
513
570
  if issr_endpt is not None:
514
571
  self._endpoint_issuer = self._sanitize_endpoint(issr_endpt)
515
572
 
@@ -521,9 +578,8 @@ class ClientDHCore(Client):
521
578
  -------
522
579
  None
523
580
  """
524
- parsed = urlparse(endpoint)
525
- if parsed.scheme not in ["http", "https"]:
526
- raise BackendError("Invalid endpoint scheme.")
581
+ if not has_remote_scheme(endpoint):
582
+ raise BackendError("Invalid endpoint scheme. Must start with http:// or https://.")
527
583
 
528
584
  endpoint = endpoint.strip()
529
585
  return endpoint.removesuffix("/")
@@ -536,19 +592,19 @@ class ClientDHCore(Client):
536
592
  -------
537
593
  None
538
594
  """
539
- self._user = os.getenv("DHCORE_USER", FALLBACK_USER)
540
- self._refresh_token = os.getenv("DHCORE_REFRESH_TOKEN")
541
- self._client_id = os.getenv("DHCORE_CLIENT_ID")
595
+ self._user = os.getenv(DhcoreEnvVar.USER.value, FALLBACK_USER)
596
+ self._refresh_token = os.getenv(DhcoreEnvVar.REFRESH_TOKEN.value)
597
+ self._client_id = os.getenv(DhcoreEnvVar.CLIENT_ID.value)
542
598
 
543
- token = os.getenv("DHCORE_ACCESS_TOKEN")
599
+ token = os.getenv(DhcoreEnvVar.ACCESS_TOKEN.value)
544
600
  if token is not None and token != "":
545
- self._auth_type = "oauth2"
601
+ self._auth_type = AuthType.OAUTH2.value
546
602
  self._access_token = token
547
603
  return
548
604
 
549
- password = os.getenv("DHCORE_PASSWORD")
605
+ password = os.getenv(DhcoreEnvVar.PASSWORD.value)
550
606
  if self._user is not None and password is not None:
551
- self._auth_type = "basic"
607
+ self._auth_type = AuthType.BASIC.value
552
608
  self._password = password
553
609
  return
554
610
 
@@ -566,12 +622,12 @@ class ClientDHCore(Client):
566
622
 
567
623
  # Call refresh token endpoint
568
624
  # Try token from env
569
- refresh_token = os.getenv("DHCORE_REFRESH_TOKEN")
625
+ refresh_token = os.getenv(DhcoreEnvVar.REFRESH_TOKEN.value)
570
626
  response = self._call_refresh_token_endpoint(url, refresh_token)
571
627
 
572
628
  # Otherwise try token from file
573
629
  if response.status_code in (400, 401, 403):
574
- refresh_token = get_key(ENV_FILE, "DHCORE_REFRESH_TOKEN")
630
+ refresh_token = get_key(ENV_FILE, DhcoreEnvVar.REFRESH_TOKEN.value)
575
631
  response = self._call_refresh_token_endpoint(url, refresh_token)
576
632
 
577
633
  response.raise_for_status()
@@ -641,9 +697,9 @@ class ClientDHCore(Client):
641
697
  """
642
698
  keys = {}
643
699
  if self._access_token is not None:
644
- keys["DHCORE_ACCESS_TOKEN"] = self._access_token
700
+ keys[DhcoreEnvVar.ACCESS_TOKEN.value] = self._access_token
645
701
  if self._refresh_token is not None:
646
- keys["DHCORE_REFRESH_TOKEN"] = self._refresh_token
702
+ keys[DhcoreEnvVar.REFRESH_TOKEN.value] = self._refresh_token
647
703
 
648
704
  for k, v in keys.items():
649
705
  set_key(dotenv_path=ENV_FILE, key_to_set=k, value_to_set=v)
@@ -0,0 +1,27 @@
1
+ from __future__ import annotations
2
+
3
+ from enum import Enum
4
+
5
+
6
+ class DhcoreEnvVar(Enum):
7
+ """
8
+ Environment variables.
9
+ """
10
+
11
+ ENDPOINT = "DHCORE_ENDPOINT"
12
+ ISSUER = "DHCORE_ISSUER"
13
+ USER = "DHCORE_USER"
14
+ PASSWORD = "DHCORE_PASSWORD"
15
+ CLIENT_ID = "DHCORE_CLIENT_ID"
16
+ ACCESS_TOKEN = "DHCORE_ACCESS_TOKEN"
17
+ REFRESH_TOKEN = "DHCORE_REFRESH_TOKEN"
18
+ WORKFLOW_IMAGE = "DHCORE_WORKFLOW_IMAGE"
19
+
20
+
21
+ class AuthType(Enum):
22
+ """
23
+ Authentication types.
24
+ """
25
+
26
+ BASIC = "basic"
27
+ OAUTH2 = "oauth2"
@@ -19,5 +19,5 @@ ENV_FILE = Path.home() / ".dhcore"
19
19
 
20
20
  # API levels that are supported
21
21
  MAX_API_LEVEL = 20
22
- MIN_API_LEVEL = 8
23
- LIB_VERSION = 8
22
+ MIN_API_LEVEL = 9
23
+ LIB_VERSION = 9