digitalhub-runtime-python 0.14.2__tar.gz → 0.15.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.
Files changed (159) hide show
  1. {digitalhub_runtime_python-0.14.2 → digitalhub_runtime_python-0.15.0}/.github/workflows/release.yml +4 -4
  2. {digitalhub_runtime_python-0.14.2 → digitalhub_runtime_python-0.15.0}/.github/workflows/run_local_test.yml +1 -1
  3. {digitalhub_runtime_python-0.14.2 → digitalhub_runtime_python-0.15.0}/.github/workflows/test_release.yml +2 -2
  4. {digitalhub_runtime_python-0.14.2 → digitalhub_runtime_python-0.15.0}/PKG-INFO +10 -5
  5. digitalhub_runtime_python-0.15.0/digitalhub_runtime_python/__init__.py +76 -0
  6. digitalhub_runtime_python-0.15.0/digitalhub_runtime_python/entities/_base/runtime_entity/builder.py +102 -0
  7. {digitalhub_runtime_python-0.14.2 → digitalhub_runtime_python-0.15.0}/digitalhub_runtime_python/entities/_commons/enums.py +12 -0
  8. digitalhub_runtime_python-0.15.0/digitalhub_runtime_python/entities/_commons/requirement_parser/enums.py +27 -0
  9. digitalhub_runtime_python-0.15.0/digitalhub_runtime_python/entities/_commons/requirement_parser/factory.py +75 -0
  10. digitalhub_runtime_python-0.15.0/digitalhub_runtime_python/entities/_commons/requirement_parser/modules/_base.py +14 -0
  11. digitalhub_runtime_python-0.15.0/digitalhub_runtime_python/entities/_commons/requirement_parser/modules/_conda.py +38 -0
  12. digitalhub_runtime_python-0.15.0/digitalhub_runtime_python/entities/_commons/requirement_parser/modules/_pip.py +43 -0
  13. digitalhub_runtime_python-0.15.0/digitalhub_runtime_python/entities/_commons/requirement_parser/modules/_pyproject.py +41 -0
  14. digitalhub_runtime_python-0.15.0/digitalhub_runtime_python/entities/_commons/requirement_parser/parser.py +96 -0
  15. digitalhub_runtime_python-0.15.0/digitalhub_runtime_python/entities/function/guardrail/builder.py +93 -0
  16. digitalhub_runtime_python-0.15.0/digitalhub_runtime_python/entities/function/guardrail/entity.py +69 -0
  17. digitalhub_runtime_python-0.15.0/digitalhub_runtime_python/entities/function/guardrail/models.py +15 -0
  18. digitalhub_runtime_python-0.15.0/digitalhub_runtime_python/entities/function/guardrail/spec.py +58 -0
  19. digitalhub_runtime_python-0.15.0/digitalhub_runtime_python/entities/function/guardrail/status.py +13 -0
  20. digitalhub_runtime_python-0.15.0/digitalhub_runtime_python/entities/function/openinference/builder.py +93 -0
  21. digitalhub_runtime_python-0.15.0/digitalhub_runtime_python/entities/function/openinference/entity.py +69 -0
  22. digitalhub_runtime_python-0.15.0/digitalhub_runtime_python/entities/function/openinference/models.py +46 -0
  23. digitalhub_runtime_python-0.15.0/digitalhub_runtime_python/entities/function/openinference/spec.py +69 -0
  24. digitalhub_runtime_python-0.15.0/digitalhub_runtime_python/entities/function/openinference/status.py +13 -0
  25. {digitalhub_runtime_python-0.14.2 → digitalhub_runtime_python-0.15.0}/digitalhub_runtime_python/entities/function/python/builder.py +4 -8
  26. {digitalhub_runtime_python-0.14.2 → digitalhub_runtime_python-0.15.0}/digitalhub_runtime_python/entities/function/python/entity.py +12 -14
  27. {digitalhub_runtime_python-0.14.2 → digitalhub_runtime_python-0.15.0}/digitalhub_runtime_python/entities/function/python/models.py +1 -1
  28. {digitalhub_runtime_python-0.14.2 → digitalhub_runtime_python-0.15.0}/digitalhub_runtime_python/entities/function/python/spec.py +3 -3
  29. {digitalhub_runtime_python-0.14.2 → digitalhub_runtime_python-0.15.0}/digitalhub_runtime_python/entities/function/python/utils.py +20 -11
  30. {digitalhub_runtime_python-0.14.2 → digitalhub_runtime_python-0.15.0}/digitalhub_runtime_python/entities/run/_base/entity.py +11 -63
  31. {digitalhub_runtime_python-0.14.2 → digitalhub_runtime_python-0.15.0}/digitalhub_runtime_python/entities/run/_base/spec.py +20 -33
  32. digitalhub_runtime_python-0.15.0/digitalhub_runtime_python/entities/run/guardrail_build/builder.py +28 -0
  33. digitalhub_runtime_python-0.15.0/digitalhub_runtime_python/entities/run/guardrail_build/entity.py +25 -0
  34. digitalhub_runtime_python-0.15.0/digitalhub_runtime_python/entities/run/guardrail_build/spec.py +70 -0
  35. digitalhub_runtime_python-0.15.0/digitalhub_runtime_python/entities/run/guardrail_build/status.py +13 -0
  36. digitalhub_runtime_python-0.15.0/digitalhub_runtime_python/entities/run/guardrail_serve/builder.py +28 -0
  37. digitalhub_runtime_python-0.15.0/digitalhub_runtime_python/entities/run/guardrail_serve/entity.py +25 -0
  38. digitalhub_runtime_python-0.15.0/digitalhub_runtime_python/entities/run/guardrail_serve/spec.py +76 -0
  39. digitalhub_runtime_python-0.15.0/digitalhub_runtime_python/entities/run/guardrail_serve/status.py +13 -0
  40. digitalhub_runtime_python-0.15.0/digitalhub_runtime_python/entities/run/openinference_build/builder.py +28 -0
  41. digitalhub_runtime_python-0.15.0/digitalhub_runtime_python/entities/run/openinference_build/entity.py +25 -0
  42. digitalhub_runtime_python-0.15.0/digitalhub_runtime_python/entities/run/openinference_build/spec.py +76 -0
  43. digitalhub_runtime_python-0.15.0/digitalhub_runtime_python/entities/run/openinference_build/status.py +13 -0
  44. digitalhub_runtime_python-0.15.0/digitalhub_runtime_python/entities/run/openinference_serve/builder.py +28 -0
  45. digitalhub_runtime_python-0.15.0/digitalhub_runtime_python/entities/run/openinference_serve/entity.py +25 -0
  46. digitalhub_runtime_python-0.15.0/digitalhub_runtime_python/entities/run/openinference_serve/spec.py +82 -0
  47. digitalhub_runtime_python-0.15.0/digitalhub_runtime_python/entities/run/openinference_serve/status.py +13 -0
  48. digitalhub_runtime_python-0.15.0/digitalhub_runtime_python/entities/run/python_build/__init__.py +3 -0
  49. {digitalhub_runtime_python-0.14.2/digitalhub_runtime_python/entities/run/build → digitalhub_runtime_python-0.15.0/digitalhub_runtime_python/entities/run/python_build}/builder.py +3 -3
  50. digitalhub_runtime_python-0.15.0/digitalhub_runtime_python/entities/run/python_build/entity.py +25 -0
  51. digitalhub_runtime_python-0.15.0/digitalhub_runtime_python/entities/run/python_job/__init__.py +3 -0
  52. {digitalhub_runtime_python-0.14.2/digitalhub_runtime_python/entities/run/job → digitalhub_runtime_python-0.15.0/digitalhub_runtime_python/entities/run/python_job}/builder.py +3 -3
  53. digitalhub_runtime_python-0.15.0/digitalhub_runtime_python/entities/run/python_job/entity.py +69 -0
  54. digitalhub_runtime_python-0.15.0/digitalhub_runtime_python/entities/run/python_job/spec.py +68 -0
  55. digitalhub_runtime_python-0.15.0/digitalhub_runtime_python/entities/run/python_serve/__init__.py +3 -0
  56. {digitalhub_runtime_python-0.14.2/digitalhub_runtime_python/entities/run/serve → digitalhub_runtime_python-0.15.0/digitalhub_runtime_python/entities/run/python_serve}/builder.py +3 -3
  57. digitalhub_runtime_python-0.15.0/digitalhub_runtime_python/entities/run/python_serve/entity.py +75 -0
  58. digitalhub_runtime_python-0.15.0/digitalhub_runtime_python/entities/task/__init__.py +3 -0
  59. digitalhub_runtime_python-0.15.0/digitalhub_runtime_python/entities/task/guardrail_build/__init__.py +3 -0
  60. digitalhub_runtime_python-0.15.0/digitalhub_runtime_python/entities/task/guardrail_build/builder.py +28 -0
  61. digitalhub_runtime_python-0.15.0/digitalhub_runtime_python/entities/task/guardrail_build/entity.py +25 -0
  62. digitalhub_runtime_python-0.15.0/digitalhub_runtime_python/entities/task/guardrail_build/spec.py +42 -0
  63. digitalhub_runtime_python-0.14.2/digitalhub_runtime_python/entities/task/job/models.py → digitalhub_runtime_python-0.15.0/digitalhub_runtime_python/entities/task/guardrail_build/status.py +3 -6
  64. digitalhub_runtime_python-0.15.0/digitalhub_runtime_python/entities/task/guardrail_serve/__init__.py +3 -0
  65. digitalhub_runtime_python-0.15.0/digitalhub_runtime_python/entities/task/guardrail_serve/builder.py +28 -0
  66. digitalhub_runtime_python-0.15.0/digitalhub_runtime_python/entities/task/guardrail_serve/entity.py +25 -0
  67. digitalhub_runtime_python-0.15.0/digitalhub_runtime_python/entities/task/guardrail_serve/spec.py +54 -0
  68. digitalhub_runtime_python-0.15.0/digitalhub_runtime_python/entities/task/guardrail_serve/status.py +13 -0
  69. digitalhub_runtime_python-0.15.0/digitalhub_runtime_python/entities/task/openinference_build/__init__.py +3 -0
  70. digitalhub_runtime_python-0.15.0/digitalhub_runtime_python/entities/task/openinference_build/builder.py +28 -0
  71. digitalhub_runtime_python-0.15.0/digitalhub_runtime_python/entities/task/openinference_build/entity.py +25 -0
  72. digitalhub_runtime_python-0.15.0/digitalhub_runtime_python/entities/task/openinference_build/spec.py +42 -0
  73. digitalhub_runtime_python-0.15.0/digitalhub_runtime_python/entities/task/openinference_build/status.py +13 -0
  74. digitalhub_runtime_python-0.15.0/digitalhub_runtime_python/entities/task/openinference_serve/__init__.py +3 -0
  75. digitalhub_runtime_python-0.15.0/digitalhub_runtime_python/entities/task/openinference_serve/builder.py +28 -0
  76. digitalhub_runtime_python-0.15.0/digitalhub_runtime_python/entities/task/openinference_serve/entity.py +25 -0
  77. digitalhub_runtime_python-0.15.0/digitalhub_runtime_python/entities/task/openinference_serve/spec.py +54 -0
  78. digitalhub_runtime_python-0.15.0/digitalhub_runtime_python/entities/task/openinference_serve/status.py +13 -0
  79. digitalhub_runtime_python-0.15.0/digitalhub_runtime_python/entities/task/python_build/__init__.py +3 -0
  80. {digitalhub_runtime_python-0.14.2/digitalhub_runtime_python/entities/task/build → digitalhub_runtime_python-0.15.0/digitalhub_runtime_python/entities/task/python_build}/builder.py +3 -3
  81. digitalhub_runtime_python-0.15.0/digitalhub_runtime_python/entities/task/python_build/entity.py +25 -0
  82. {digitalhub_runtime_python-0.14.2/digitalhub_runtime_python/entities/task/build → digitalhub_runtime_python-0.15.0/digitalhub_runtime_python/entities/task/python_build}/spec.py +7 -17
  83. digitalhub_runtime_python-0.15.0/digitalhub_runtime_python/entities/task/python_job/__init__.py +3 -0
  84. {digitalhub_runtime_python-0.14.2/digitalhub_runtime_python/entities/task/job → digitalhub_runtime_python-0.15.0/digitalhub_runtime_python/entities/task/python_job}/builder.py +3 -3
  85. digitalhub_runtime_python-0.15.0/digitalhub_runtime_python/entities/task/python_job/entity.py +25 -0
  86. digitalhub_runtime_python-0.15.0/digitalhub_runtime_python/entities/task/python_serve/__init__.py +3 -0
  87. {digitalhub_runtime_python-0.14.2/digitalhub_runtime_python/entities/task/serve → digitalhub_runtime_python-0.15.0/digitalhub_runtime_python/entities/task/python_serve}/builder.py +3 -3
  88. digitalhub_runtime_python-0.15.0/digitalhub_runtime_python/entities/task/python_serve/entity.py +25 -0
  89. {digitalhub_runtime_python-0.14.2/digitalhub_runtime_python/entities/task/serve → digitalhub_runtime_python-0.15.0/digitalhub_runtime_python/entities/task/python_serve}/spec.py +9 -19
  90. digitalhub_runtime_python-0.15.0/digitalhub_runtime_python/runtimes/__init__.py +3 -0
  91. digitalhub_runtime_python-0.15.0/digitalhub_runtime_python/runtimes/builder.py +38 -0
  92. {digitalhub_runtime_python-0.14.2 → digitalhub_runtime_python-0.15.0}/digitalhub_runtime_python/runtimes/runtime.py +31 -55
  93. digitalhub_runtime_python-0.15.0/digitalhub_runtime_python/utils/configuration.py +350 -0
  94. {digitalhub_runtime_python-0.14.2 → digitalhub_runtime_python-0.15.0}/digitalhub_runtime_python/utils/inputs.py +21 -15
  95. {digitalhub_runtime_python-0.14.2 → digitalhub_runtime_python-0.15.0}/digitalhub_runtime_python/utils/outputs.py +28 -32
  96. {digitalhub_runtime_python-0.14.2 → digitalhub_runtime_python-0.15.0}/pyproject.toml +13 -8
  97. digitalhub_runtime_python-0.15.0/test/instances/entities/run/run-python+build:run.json +915 -0
  98. digitalhub_runtime_python-0.15.0/test/instances/entities/run/run-python+job:run.json +465 -0
  99. digitalhub_runtime_python-0.15.0/test/instances/entities/run/run-python+serve:run.json +1960 -0
  100. {digitalhub_runtime_python-0.14.2 → digitalhub_runtime_python-0.15.0}/test/instances/entities/task/task-python+build.json +2 -12
  101. {digitalhub_runtime_python-0.14.2 → digitalhub_runtime_python-0.15.0}/test/instances/entities/task/task-python+job.json +2 -16
  102. {digitalhub_runtime_python-0.14.2 → digitalhub_runtime_python-0.15.0}/test/instances/entities/task/task-python+serve.json +2 -15
  103. {digitalhub_runtime_python-0.14.2 → digitalhub_runtime_python-0.15.0}/test/instances/test_validate.py +1 -2
  104. digitalhub_runtime_python-0.14.2/digitalhub_runtime_python/__init__.py +0 -29
  105. digitalhub_runtime_python-0.14.2/digitalhub_runtime_python/entities/_base/runtime_entity/builder.py +0 -46
  106. digitalhub_runtime_python-0.14.2/digitalhub_runtime_python/entities/run/_base/builder.py +0 -25
  107. digitalhub_runtime_python-0.14.2/digitalhub_runtime_python/entities/run/build/entity.py +0 -36
  108. digitalhub_runtime_python-0.14.2/digitalhub_runtime_python/entities/run/job/entity.py +0 -36
  109. digitalhub_runtime_python-0.14.2/digitalhub_runtime_python/entities/run/job/spec.py +0 -15
  110. digitalhub_runtime_python-0.14.2/digitalhub_runtime_python/entities/run/serve/entity.py +0 -36
  111. digitalhub_runtime_python-0.14.2/digitalhub_runtime_python/entities/task/build/entity.py +0 -36
  112. digitalhub_runtime_python-0.14.2/digitalhub_runtime_python/entities/task/job/entity.py +0 -36
  113. digitalhub_runtime_python-0.14.2/digitalhub_runtime_python/entities/task/serve/entity.py +0 -36
  114. digitalhub_runtime_python-0.14.2/digitalhub_runtime_python/runtimes/builder.py +0 -15
  115. digitalhub_runtime_python-0.14.2/digitalhub_runtime_python/utils/configuration.py +0 -212
  116. digitalhub_runtime_python-0.14.2/test/instances/entities/run/run-python+build:run.json +0 -920
  117. digitalhub_runtime_python-0.14.2/test/instances/entities/run/run-python+job:run.json +0 -472
  118. digitalhub_runtime_python-0.14.2/test/instances/entities/run/run-python+serve:run.json +0 -1965
  119. {digitalhub_runtime_python-0.14.2 → digitalhub_runtime_python-0.15.0}/.github/scripts/bump.sh +0 -0
  120. {digitalhub_runtime_python-0.14.2 → digitalhub_runtime_python-0.15.0}/.github/scripts/changelog.sh +0 -0
  121. {digitalhub_runtime_python-0.14.2 → digitalhub_runtime_python-0.15.0}/.github/scripts/cliff.toml +0 -0
  122. {digitalhub_runtime_python-0.14.2 → digitalhub_runtime_python-0.15.0}/.gitignore +0 -0
  123. {digitalhub_runtime_python-0.14.2 → digitalhub_runtime_python-0.15.0}/AUTHORS +0 -0
  124. {digitalhub_runtime_python-0.14.2 → digitalhub_runtime_python-0.15.0}/CONTRIBUTING +0 -0
  125. {digitalhub_runtime_python-0.14.2 → digitalhub_runtime_python-0.15.0}/COPYRIGHT +0 -0
  126. {digitalhub_runtime_python-0.14.2 → digitalhub_runtime_python-0.15.0}/LICENSE +0 -0
  127. {digitalhub_runtime_python-0.14.2 → digitalhub_runtime_python-0.15.0}/README.md +0 -0
  128. {digitalhub_runtime_python-0.14.2 → digitalhub_runtime_python-0.15.0}/digitalhub_runtime_python/entities/__init__.py +0 -0
  129. {digitalhub_runtime_python-0.14.2 → digitalhub_runtime_python-0.15.0}/digitalhub_runtime_python/entities/_base/__init__.py +0 -0
  130. {digitalhub_runtime_python-0.14.2 → digitalhub_runtime_python-0.15.0}/digitalhub_runtime_python/entities/_base/runtime_entity/__init__.py +0 -0
  131. {digitalhub_runtime_python-0.14.2 → digitalhub_runtime_python-0.15.0}/digitalhub_runtime_python/entities/_commons/__init__.py +0 -0
  132. {digitalhub_runtime_python-0.14.2/digitalhub_runtime_python/entities/function → digitalhub_runtime_python-0.15.0/digitalhub_runtime_python/entities/_commons/requirement_parser}/__init__.py +0 -0
  133. {digitalhub_runtime_python-0.14.2/digitalhub_runtime_python/entities/function/python → digitalhub_runtime_python-0.15.0/digitalhub_runtime_python/entities/_commons/requirement_parser/modules}/__init__.py +0 -0
  134. {digitalhub_runtime_python-0.14.2/digitalhub_runtime_python/entities/run → digitalhub_runtime_python-0.15.0/digitalhub_runtime_python/entities/function}/__init__.py +0 -0
  135. {digitalhub_runtime_python-0.14.2/digitalhub_runtime_python/entities/run/_base → digitalhub_runtime_python-0.15.0/digitalhub_runtime_python/entities/function/guardrail}/__init__.py +0 -0
  136. {digitalhub_runtime_python-0.14.2/digitalhub_runtime_python/entities/run/build → digitalhub_runtime_python-0.15.0/digitalhub_runtime_python/entities/function/openinference}/__init__.py +0 -0
  137. {digitalhub_runtime_python-0.14.2/digitalhub_runtime_python/entities/run/job → digitalhub_runtime_python-0.15.0/digitalhub_runtime_python/entities/function/python}/__init__.py +0 -0
  138. {digitalhub_runtime_python-0.14.2 → digitalhub_runtime_python-0.15.0}/digitalhub_runtime_python/entities/function/python/status.py +0 -0
  139. {digitalhub_runtime_python-0.14.2/digitalhub_runtime_python/entities/run/serve → digitalhub_runtime_python-0.15.0/digitalhub_runtime_python/entities/run}/__init__.py +0 -0
  140. {digitalhub_runtime_python-0.14.2/digitalhub_runtime_python/entities/task → digitalhub_runtime_python-0.15.0/digitalhub_runtime_python/entities/run/_base}/__init__.py +0 -0
  141. {digitalhub_runtime_python-0.14.2 → digitalhub_runtime_python-0.15.0}/digitalhub_runtime_python/entities/run/_base/status.py +0 -0
  142. {digitalhub_runtime_python-0.14.2 → digitalhub_runtime_python-0.15.0}/digitalhub_runtime_python/entities/run/_base/utils.py +0 -0
  143. {digitalhub_runtime_python-0.14.2/digitalhub_runtime_python/entities/task/build → digitalhub_runtime_python-0.15.0/digitalhub_runtime_python/entities/run/guardrail_build}/__init__.py +0 -0
  144. {digitalhub_runtime_python-0.14.2/digitalhub_runtime_python/entities/task/job → digitalhub_runtime_python-0.15.0/digitalhub_runtime_python/entities/run/guardrail_serve}/__init__.py +0 -0
  145. {digitalhub_runtime_python-0.14.2/digitalhub_runtime_python/entities/task/serve → digitalhub_runtime_python-0.15.0/digitalhub_runtime_python/entities/run/openinference_build}/__init__.py +0 -0
  146. {digitalhub_runtime_python-0.14.2/digitalhub_runtime_python/runtimes → digitalhub_runtime_python-0.15.0/digitalhub_runtime_python/entities/run/openinference_serve}/__init__.py +0 -0
  147. {digitalhub_runtime_python-0.14.2/digitalhub_runtime_python/entities/run/build → digitalhub_runtime_python-0.15.0/digitalhub_runtime_python/entities/run/python_build}/spec.py +0 -0
  148. {digitalhub_runtime_python-0.14.2/digitalhub_runtime_python/entities/run/build → digitalhub_runtime_python-0.15.0/digitalhub_runtime_python/entities/run/python_build}/status.py +0 -0
  149. {digitalhub_runtime_python-0.14.2/digitalhub_runtime_python/entities/run/job → digitalhub_runtime_python-0.15.0/digitalhub_runtime_python/entities/run/python_job}/status.py +0 -0
  150. {digitalhub_runtime_python-0.14.2/digitalhub_runtime_python/entities/run/serve → digitalhub_runtime_python-0.15.0/digitalhub_runtime_python/entities/run/python_serve}/spec.py +0 -0
  151. {digitalhub_runtime_python-0.14.2/digitalhub_runtime_python/entities/run/serve → digitalhub_runtime_python-0.15.0/digitalhub_runtime_python/entities/run/python_serve}/status.py +0 -0
  152. {digitalhub_runtime_python-0.14.2/digitalhub_runtime_python/entities/task/build → digitalhub_runtime_python-0.15.0/digitalhub_runtime_python/entities/task/python_build}/status.py +0 -0
  153. {digitalhub_runtime_python-0.14.2/digitalhub_runtime_python/entities/task/job → digitalhub_runtime_python-0.15.0/digitalhub_runtime_python/entities/task/python_job}/spec.py +0 -0
  154. {digitalhub_runtime_python-0.14.2/digitalhub_runtime_python/entities/task/job → digitalhub_runtime_python-0.15.0/digitalhub_runtime_python/entities/task/python_job}/status.py +0 -0
  155. {digitalhub_runtime_python-0.14.2/digitalhub_runtime_python/entities/task/serve → digitalhub_runtime_python-0.15.0/digitalhub_runtime_python/entities/task/python_serve}/status.py +0 -0
  156. {digitalhub_runtime_python-0.14.2 → digitalhub_runtime_python-0.15.0}/digitalhub_runtime_python/utils/utils.py +0 -0
  157. {digitalhub_runtime_python-0.14.2 → digitalhub_runtime_python-0.15.0}/test/instances/entities/function/function-python-git.json +0 -0
  158. {digitalhub_runtime_python-0.14.2 → digitalhub_runtime_python-0.15.0}/test/instances/entities/function/function-python-local.json +0 -0
  159. {digitalhub_runtime_python-0.14.2 → digitalhub_runtime_python-0.15.0}/test/instances/entities/function/function-python-zip.json +0 -0
@@ -31,7 +31,7 @@ jobs:
31
31
  - uses: actions/checkout@v4
32
32
  - uses: actions/setup-python@v5
33
33
  with:
34
- python-version: "3.10"
34
+ python-version: "3.12"
35
35
 
36
36
  - name: Install bumpver
37
37
  run: python -m pip install bumpver
@@ -67,7 +67,7 @@ jobs:
67
67
  ref: ${{ github.ref }}
68
68
  - uses: actions/setup-python@v5
69
69
  with:
70
- python-version: "3.10"
70
+ python-version: "3.12"
71
71
 
72
72
  # Build wheel to upload
73
73
  - name: Install build and build a binary wheel
@@ -91,7 +91,7 @@ jobs:
91
91
 
92
92
  - uses: actions/setup-python@v5
93
93
  with:
94
- python-version: "3.10"
94
+ python-version: "3.12"
95
95
 
96
96
  - name: Install cliff
97
97
  run: python -m pip install git-cliff
@@ -132,7 +132,7 @@ jobs:
132
132
  branch=${{ github.ref }}
133
133
 
134
134
  # Define the repositories to trigger
135
- repos=("digitalhub-sdk-wrapper-kfp" "digitalhub-serverless" "digitalhub-sdk-wrapper-hera")
135
+ repos=( "digitalhub-tests" "digitalhub-serverless" "digitalhub-sdk-wrapper-hera")
136
136
 
137
137
  # Loop over the repositories and trigger the workflow
138
138
  for repo in "${repos[@]}"; do
@@ -7,7 +7,7 @@ jobs:
7
7
  runs-on: ubuntu-latest
8
8
  strategy:
9
9
  matrix:
10
- python-version: ["3.9", "3.10", "3.11", "3.12"]
10
+ python-version: ["3.10", "3.11", "3.12", "3.13", "3.14"]
11
11
 
12
12
  steps:
13
13
  - uses: actions/checkout@v4
@@ -31,7 +31,7 @@ jobs:
31
31
  - uses: actions/checkout@v4
32
32
  - uses: actions/setup-python@v5
33
33
  with:
34
- python-version: "3.10"
34
+ python-version: "3.12"
35
35
 
36
36
  - name: Install bumpver
37
37
  run: python -m pip install bumpver
@@ -59,7 +59,7 @@ jobs:
59
59
 
60
60
  - uses: actions/setup-python@v5
61
61
  with:
62
- python-version: "3.10"
62
+ python-version: "3.12"
63
63
 
64
64
  - name: Install cliff
65
65
  run: python -m pip install git-cliff
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: digitalhub-runtime-python
3
- Version: 0.14.2
3
+ Version: 0.15.0
4
4
  Summary: Python runtime for DHCore
5
5
  Project-URL: Homepage, https://github.com/scc-digitalhub/digitalhub-sdk-runtime-python
6
6
  Author-email: Fondazione Bruno Kessler <digitalhub@fbk.eu>, Matteo Martini <mmartini@fbk.eu>
@@ -209,15 +209,20 @@ License-File: AUTHORS
209
209
  License-File: LICENSE
210
210
  Keywords: data,dataops,kubernetes
211
211
  Classifier: License :: OSI Approved :: Apache Software License
212
- Classifier: Programming Language :: Python :: 3.9
213
212
  Classifier: Programming Language :: Python :: 3.10
214
213
  Classifier: Programming Language :: Python :: 3.11
215
214
  Classifier: Programming Language :: Python :: 3.12
216
- Requires-Python: <3.13,>=3.9
217
- Requires-Dist: digitalhub[full]<0.15,>=0.14.0
215
+ Classifier: Programming Language :: Python :: 3.13
216
+ Classifier: Programming Language :: Python :: 3.14
217
+ Requires-Python: <3.15,>=3.10
218
+ Requires-Dist: digitalhub[full]<0.16,>=0.15.0b
219
+ Requires-Dist: msgpack
218
220
  Requires-Dist: nuclio-sdk
221
+ Requires-Dist: pip
222
+ Requires-Dist: pyyaml
223
+ Requires-Dist: tomli; python_version < '3.11'
219
224
  Provides-Extra: dev
220
- Requires-Dist: digitalhub[dev]<0.15,>=0.14.0; extra == 'dev'
225
+ Requires-Dist: digitalhub[dev]<0.16,>=0.15.0b; extra == 'dev'
221
226
  Description-Content-Type: text/markdown
222
227
 
223
228
  # DigitalHub SDK Runtime Python
@@ -0,0 +1,76 @@
1
+ # SPDX-FileCopyrightText: © 2025 DSLab - Fondazione Bruno Kessler
2
+ #
3
+ # SPDX-License-Identifier: Apache-2.0
4
+ from digitalhub_runtime_python.entities._commons.enums import EntityKinds
5
+ from digitalhub_runtime_python.entities.function.guardrail.builder import FunctionGuardrailBuilder
6
+ from digitalhub_runtime_python.entities.function.openinference.builder import FunctionOpeninferenceBuilder
7
+ from digitalhub_runtime_python.entities.function.python.builder import FunctionPythonBuilder
8
+ from digitalhub_runtime_python.entities.run.guardrail_build.builder import RunGuardrailRunBuildBuilder
9
+ from digitalhub_runtime_python.entities.run.guardrail_serve.builder import RunGuardrailRunServeBuilder
10
+ from digitalhub_runtime_python.entities.run.openinference_build.builder import RunOpeninferenceRunBuildBuilder
11
+ from digitalhub_runtime_python.entities.run.openinference_serve.builder import RunOpeninferenceRunServeBuilder
12
+ from digitalhub_runtime_python.entities.run.python_build.builder import RunPythonRunBuildBuilder
13
+ from digitalhub_runtime_python.entities.run.python_job.builder import RunPythonRunJobBuilder
14
+ from digitalhub_runtime_python.entities.run.python_serve.builder import RunPythonRunServeBuilder
15
+ from digitalhub_runtime_python.entities.task.guardrail_build.builder import TaskGuardrailBuildBuilder
16
+ from digitalhub_runtime_python.entities.task.guardrail_serve.builder import TaskGuardrailServeBuilder
17
+ from digitalhub_runtime_python.entities.task.openinference_build.builder import TaskOpeninferenceBuildBuilder
18
+ from digitalhub_runtime_python.entities.task.openinference_serve.builder import TaskOpeninferenceServeBuilder
19
+ from digitalhub_runtime_python.entities.task.python_build.builder import TaskPythonBuildBuilder
20
+ from digitalhub_runtime_python.entities.task.python_job.builder import TaskPythonJobBuilder
21
+ from digitalhub_runtime_python.entities.task.python_serve.builder import TaskPythonServeBuilder
22
+ from digitalhub_runtime_python.utils.utils import handler
23
+
24
+ entity_builders = (
25
+ (EntityKinds.FUNCTION_GUARDRAIL.value, FunctionGuardrailBuilder),
26
+ (EntityKinds.FUNCTION_OPENINFERENCE.value, FunctionOpeninferenceBuilder),
27
+ (EntityKinds.FUNCTION_PYTHON.value, FunctionPythonBuilder),
28
+ (EntityKinds.RUN_GUARDRAIL_BUILD.value, RunGuardrailRunBuildBuilder),
29
+ (EntityKinds.RUN_GUARDRAIL_SERVE.value, RunGuardrailRunServeBuilder),
30
+ (EntityKinds.RUN_OPENINFERENCE_BUILD.value, RunOpeninferenceRunBuildBuilder),
31
+ (EntityKinds.RUN_OPENINFERENCE_SERVE.value, RunOpeninferenceRunServeBuilder),
32
+ (EntityKinds.RUN_PYTHON_BUILD.value, RunPythonRunBuildBuilder),
33
+ (EntityKinds.RUN_PYTHON_JOB.value, RunPythonRunJobBuilder),
34
+ (EntityKinds.RUN_PYTHON_SERVE.value, RunPythonRunServeBuilder),
35
+ (EntityKinds.TASK_GUARDRAIL_BUILD.value, TaskGuardrailBuildBuilder),
36
+ (EntityKinds.TASK_GUARDRAIL_SERVE.value, TaskGuardrailServeBuilder),
37
+ (EntityKinds.TASK_OPENINFERENCE_BUILD.value, TaskOpeninferenceBuildBuilder),
38
+ (EntityKinds.TASK_OPENINFERENCE_SERVE.value, TaskOpeninferenceServeBuilder),
39
+ (EntityKinds.TASK_PYTHON_BUILD.value, TaskPythonBuildBuilder),
40
+ (EntityKinds.TASK_PYTHON_JOB.value, TaskPythonJobBuilder),
41
+ (EntityKinds.TASK_PYTHON_SERVE.value, TaskPythonServeBuilder),
42
+ )
43
+
44
+ try:
45
+ from digitalhub_runtime_python.runtimes.builder import (
46
+ RuntimeGuardrailBuilder,
47
+ RuntimeOpeninferenceBuilder,
48
+ RuntimePythonBuilder,
49
+ RuntimePythonJobBuilder,
50
+ )
51
+
52
+ runtime_builders = (
53
+ (EntityKinds.FUNCTION_GUARDRAIL.value, RuntimeGuardrailBuilder),
54
+ (EntityKinds.FUNCTION_OPENINFERENCE.value, RuntimeOpeninferenceBuilder),
55
+ (EntityKinds.FUNCTION_PYTHON.value, RuntimePythonBuilder),
56
+ (EntityKinds.RUN_GUARDRAIL_BUILD.value, RuntimeGuardrailBuilder),
57
+ (EntityKinds.RUN_GUARDRAIL_SERVE.value, RuntimeGuardrailBuilder),
58
+ (EntityKinds.RUN_OPENINFERENCE_BUILD.value, RuntimeOpeninferenceBuilder),
59
+ (EntityKinds.RUN_OPENINFERENCE_SERVE.value, RuntimeOpeninferenceBuilder),
60
+ (EntityKinds.RUN_PYTHON_BUILD.value, RuntimePythonBuilder),
61
+ (EntityKinds.RUN_PYTHON_JOB.value, RuntimePythonJobBuilder),
62
+ (EntityKinds.RUN_PYTHON_SERVE.value, RuntimePythonBuilder),
63
+ (EntityKinds.TASK_GUARDRAIL_BUILD.value, RuntimeGuardrailBuilder),
64
+ (EntityKinds.TASK_GUARDRAIL_SERVE.value, RuntimeGuardrailBuilder),
65
+ (EntityKinds.TASK_OPENINFERENCE_BUILD.value, RuntimeOpeninferenceBuilder),
66
+ (EntityKinds.TASK_OPENINFERENCE_SERVE.value, RuntimeOpeninferenceBuilder),
67
+ (EntityKinds.TASK_PYTHON_BUILD.value, RuntimePythonBuilder),
68
+ (EntityKinds.TASK_PYTHON_JOB.value, RuntimePythonJobBuilder),
69
+ (EntityKinds.TASK_PYTHON_SERVE.value, RuntimePythonBuilder),
70
+ )
71
+ except ImportError as e:
72
+ from digitalhub.utils.logger.logger import get_logger
73
+
74
+ logger = get_logger(__name__)
75
+ logger.debug(f"Error importing runtime builders: {e}")
76
+ runtime_builders = tuple()
@@ -0,0 +1,102 @@
1
+ # SPDX-FileCopyrightText: © 2025 DSLab - Fondazione Bruno Kessler
2
+ #
3
+ # SPDX-License-Identifier: Apache-2.0
4
+
5
+ from __future__ import annotations
6
+
7
+ from digitalhub.entities._base.runtime_entity.builder import RuntimeEntityBuilder
8
+ from digitalhub.entities._commons.utils import map_actions
9
+
10
+ from digitalhub_runtime_python.entities._commons.enums import Actions, EntityKinds
11
+
12
+
13
+ class RuntimeEntityBuilderPython(RuntimeEntityBuilder):
14
+ EXECUTABLE_KIND = EntityKinds.FUNCTION_PYTHON.value
15
+ TASKS_KINDS = map_actions(
16
+ [
17
+ (
18
+ EntityKinds.TASK_PYTHON_JOB.value,
19
+ Actions.JOB.value,
20
+ ),
21
+ (
22
+ EntityKinds.TASK_PYTHON_BUILD.value,
23
+ Actions.BUILD.value,
24
+ ),
25
+ (
26
+ EntityKinds.TASK_PYTHON_SERVE.value,
27
+ Actions.SERVE.value,
28
+ ),
29
+ ]
30
+ )
31
+ RUN_KINDS = map_actions(
32
+ [
33
+ (
34
+ EntityKinds.RUN_PYTHON_JOB.value,
35
+ Actions.JOB.value,
36
+ ),
37
+ (
38
+ EntityKinds.RUN_PYTHON_BUILD.value,
39
+ Actions.BUILD.value,
40
+ ),
41
+ (
42
+ EntityKinds.RUN_PYTHON_SERVE.value,
43
+ Actions.SERVE.value,
44
+ ),
45
+ ]
46
+ )
47
+
48
+
49
+ class RuntimeEntityBuilderOpeninference(RuntimeEntityBuilder):
50
+ EXECUTABLE_KIND = EntityKinds.FUNCTION_OPENINFERENCE.value
51
+ TASKS_KINDS = map_actions(
52
+ [
53
+ (
54
+ EntityKinds.TASK_OPENINFERENCE_BUILD.value,
55
+ Actions.BUILD.value,
56
+ ),
57
+ (
58
+ EntityKinds.TASK_OPENINFERENCE_SERVE.value,
59
+ Actions.SERVE.value,
60
+ ),
61
+ ]
62
+ )
63
+ RUN_KINDS = map_actions(
64
+ [
65
+ (
66
+ EntityKinds.RUN_OPENINFERENCE_BUILD.value,
67
+ Actions.BUILD.value,
68
+ ),
69
+ (
70
+ EntityKinds.RUN_OPENINFERENCE_SERVE.value,
71
+ Actions.SERVE.value,
72
+ ),
73
+ ]
74
+ )
75
+
76
+
77
+ class RuntimeEntityBuilderGuardrail(RuntimeEntityBuilder):
78
+ EXECUTABLE_KIND = EntityKinds.FUNCTION_GUARDRAIL.value
79
+ TASKS_KINDS = map_actions(
80
+ [
81
+ (
82
+ EntityKinds.TASK_GUARDRAIL_BUILD.value,
83
+ Actions.BUILD.value,
84
+ ),
85
+ (
86
+ EntityKinds.TASK_GUARDRAIL_SERVE.value,
87
+ Actions.SERVE.value,
88
+ ),
89
+ ]
90
+ )
91
+ RUN_KINDS = map_actions(
92
+ [
93
+ (
94
+ EntityKinds.RUN_GUARDRAIL_BUILD.value,
95
+ Actions.BUILD.value,
96
+ ),
97
+ (
98
+ EntityKinds.RUN_GUARDRAIL_SERVE.value,
99
+ Actions.SERVE.value,
100
+ ),
101
+ ]
102
+ )
@@ -20,6 +20,18 @@ class EntityKinds(Enum):
20
20
  RUN_PYTHON_JOB = "python+job:run"
21
21
  RUN_PYTHON_SERVE = "python+serve:run"
22
22
 
23
+ FUNCTION_OPENINFERENCE = "openinference"
24
+ TASK_OPENINFERENCE_BUILD = "openinference+build"
25
+ TASK_OPENINFERENCE_SERVE = "openinference+serve"
26
+ RUN_OPENINFERENCE_BUILD = "openinference+build:run"
27
+ RUN_OPENINFERENCE_SERVE = "openinference+serve:run"
28
+
29
+ FUNCTION_GUARDRAIL = "guardrail"
30
+ TASK_GUARDRAIL_BUILD = "guardrail+build"
31
+ TASK_GUARDRAIL_SERVE = "guardrail+serve"
32
+ RUN_GUARDRAIL_BUILD = "guardrail+build:run"
33
+ RUN_GUARDRAIL_SERVE = "guardrail+serve:run"
34
+
23
35
 
24
36
  class Actions(Enum):
25
37
  """
@@ -0,0 +1,27 @@
1
+ # SPDX-FileCopyrightText: © 2025 DSLab - Fondazione Bruno Kessler
2
+ #
3
+ # SPDX-License-Identifier: Apache-2.0
4
+
5
+ from enum import Enum
6
+
7
+
8
+ class RequirementFormat(Enum):
9
+ """
10
+ Enum for requirement file formats.
11
+ """
12
+
13
+ PIP = "pip"
14
+ PYPROJECT = "pyproject"
15
+ CONDA = "conda"
16
+
17
+
18
+ class RequirementFile(Enum):
19
+ """
20
+ Enum for requirement file names.
21
+ """
22
+
23
+ REQUIREMENTS_TXT = "requirements.txt"
24
+ SETUP_PY = "setup.py"
25
+ PYPROJECT_TOML = "pyproject.toml"
26
+ CONDA_ENV_YAML = "conda.yaml"
27
+ CONDA_ENV_YML = "conda.yml"
@@ -0,0 +1,75 @@
1
+ # SPDX-FileCopyrightText: © 2025 DSLab - Fondazione Bruno Kessler
2
+ #
3
+ # SPDX-License-Identifier: Apache-2.0
4
+ from __future__ import annotations
5
+
6
+ from pathlib import Path
7
+
8
+ from digitalhub_runtime_python.entities._commons.requirement_parser.enums import RequirementFile, RequirementFormat
9
+ from digitalhub_runtime_python.entities._commons.requirement_parser.modules._base import BaseParser
10
+ from digitalhub_runtime_python.entities._commons.requirement_parser.modules._conda import CondaParser
11
+ from digitalhub_runtime_python.entities._commons.requirement_parser.modules._pip import PipParser
12
+ from digitalhub_runtime_python.entities._commons.requirement_parser.modules._pyproject import PyProjectParser
13
+
14
+
15
+ class RequirementParserFactory:
16
+ """
17
+ Factory for requirement parsers.
18
+ """
19
+
20
+ def get_parser(self, requirements_file: str) -> BaseParser:
21
+ """
22
+ Get the requirement parser based on the format.
23
+
24
+ Parameters
25
+ ----------
26
+ requirements_file : str
27
+ The path to the requirements file.
28
+
29
+ Returns
30
+ -------
31
+ BaseParser
32
+ The requirement parser.
33
+ """
34
+ req_type = self._requirements_format(requirements_file)
35
+ match req_type:
36
+ case RequirementFormat.PIP:
37
+ return PipParser()
38
+ case RequirementFormat.PYPROJECT:
39
+ return PyProjectParser()
40
+ case RequirementFormat.CONDA:
41
+ return CondaParser()
42
+ case _:
43
+ raise ValueError(f"No parser found for format: {requirements_file}")
44
+
45
+ @staticmethod
46
+ def _requirements_format(requirements_file: str) -> RequirementFormat:
47
+ """
48
+ Understand requirements file format.
49
+
50
+ Parameters
51
+ ----------
52
+ requirements_file : str
53
+ The path to the requirements file.
54
+
55
+ Returns
56
+ -------
57
+ RequirementFormat
58
+ The format of the requirements file (e.g., 'pip', 'pyproject', 'conda').
59
+ """
60
+ match Path(requirements_file).name:
61
+ case RequirementFile.REQUIREMENTS_TXT.value:
62
+ return RequirementFormat.PIP
63
+ case RequirementFile.SETUP_PY.value:
64
+ return RequirementFormat.PIP
65
+ case RequirementFile.PYPROJECT_TOML.value:
66
+ return RequirementFormat.PYPROJECT
67
+ case RequirementFile.CONDA_ENV_YML.value:
68
+ return RequirementFormat.CONDA
69
+ case RequirementFile.CONDA_ENV_YAML.value:
70
+ return RequirementFormat.CONDA
71
+ case _:
72
+ raise ValueError(
73
+ f"Unsupported requirements file: {Path(requirements_file).name}."
74
+ f" Supported filenames are: {', '.join([f.value for f in RequirementFile])}."
75
+ )
@@ -0,0 +1,14 @@
1
+ # SPDX-FileCopyrightText: © 2025 DSLab - Fondazione Bruno Kessler
2
+ #
3
+ # SPDX-License-Identifier: Apache-2.0
4
+
5
+ from abc import abstractmethod
6
+
7
+
8
+ class BaseParser:
9
+ @staticmethod
10
+ @abstractmethod
11
+ def parse_requirements(source: str) -> list[str]:
12
+ """
13
+ Parses the requirements file and returns a list of dependencies.
14
+ """
@@ -0,0 +1,38 @@
1
+ # SPDX-FileCopyrightText: © 2025 DSLab - Fondazione Bruno Kessler
2
+ #
3
+ # SPDX-License-Identifier: Apache-2.0
4
+
5
+ import yaml
6
+
7
+ from digitalhub_runtime_python.entities._commons.requirement_parser.modules._base import BaseParser
8
+
9
+
10
+ class CondaParser(BaseParser):
11
+ @staticmethod
12
+ def parse_requirements(source: str) -> list[str]:
13
+ """
14
+ Parse an environment.yml file.
15
+
16
+ Parameters
17
+ ----------
18
+ source : str
19
+ Path to an environment.yml file.
20
+
21
+ Returns
22
+ -------
23
+ list[str]
24
+ A list of requirement strings.
25
+ """
26
+ requirements = []
27
+
28
+ with open(source, "r") as f:
29
+ data = yaml.safe_load(f)
30
+
31
+ if not data or "dependencies" not in data:
32
+ return requirements
33
+
34
+ for dep in data["dependencies"]:
35
+ if isinstance(dep, dict) and "pip" in dep:
36
+ requirements.extend(dep["pip"])
37
+
38
+ return requirements
@@ -0,0 +1,43 @@
1
+ # SPDX-FileCopyrightText: © 2025 DSLab - Fondazione Bruno Kessler
2
+ #
3
+ # SPDX-License-Identifier: Apache-2.0
4
+
5
+ from pip._internal.network.session import PipSession
6
+ from pip._internal.req import parse_requirements as pip_parse
7
+
8
+ from digitalhub_runtime_python.entities._commons.requirement_parser.modules._base import BaseParser
9
+
10
+
11
+ class PipParser(BaseParser):
12
+ @staticmethod
13
+ def parse_requirements(source: str) -> list[str]:
14
+ """
15
+ Parse a requirements.txt file using pip's internal parser.
16
+
17
+ Parameters
18
+ ----------
19
+ source : str
20
+ Path to a requirements.txt file.
21
+
22
+ Returns
23
+ -------
24
+ list[str]
25
+ A list of requirement strings as they would be understood by pip.
26
+
27
+ Examples
28
+ --------
29
+ >>> requirements = parse_requirements_with_pip("/path/to/requirements.txt")
30
+ >>> print(requirements)
31
+ ['numpy>=1.0', 'pandas==2.0.0', 'git+https://github.com/user/repo.git@main']
32
+ """
33
+ # Parse using pip's internal parser
34
+ session = PipSession()
35
+ parsed = pip_parse(source, session=session)
36
+
37
+ # Extract requirement strings
38
+ requirements = []
39
+ for req in parsed:
40
+ if req.requirement:
41
+ requirements.append(str(req.requirement))
42
+
43
+ return requirements
@@ -0,0 +1,41 @@
1
+ # SPDX-FileCopyrightText: © 2025 DSLab - Fondazione Bruno Kessler
2
+ #
3
+ # SPDX-License-Identifier: Apache-2.0
4
+
5
+ try:
6
+ import tomllib
7
+ except ImportError:
8
+ import tomli as tomllib
9
+
10
+ from digitalhub_runtime_python.entities._commons.requirement_parser.modules._base import BaseParser
11
+
12
+
13
+ class PyProjectParser(BaseParser):
14
+ @staticmethod
15
+ def parse_requirements(source: str) -> list[str]:
16
+ """
17
+ Parse a pyproject.toml file.
18
+
19
+ Parameters
20
+ ----------
21
+ source : str
22
+ Path to a pyproject.toml file.
23
+
24
+ Returns
25
+ -------
26
+ list[str]
27
+ A list of requirement strings.
28
+ """
29
+ requirements = []
30
+
31
+ with open(source, "rb") as f:
32
+ data = tomllib.load(f)
33
+
34
+ project = data.get("project", {})
35
+
36
+ # Dependencies
37
+ dependencies = project.get("dependencies", [])
38
+ if isinstance(dependencies, list):
39
+ requirements.extend(dependencies)
40
+
41
+ return requirements
@@ -0,0 +1,96 @@
1
+ # SPDX-FileCopyrightText: © 2025 DSLab - Fondazione Bruno Kessler
2
+ #
3
+ # SPDX-License-Identifier: Apache-2.0
4
+ from __future__ import annotations
5
+
6
+ from pathlib import Path
7
+
8
+ from pip._internal.operations import freeze
9
+
10
+ from digitalhub_runtime_python.entities._commons.requirement_parser.factory import RequirementParserFactory
11
+
12
+
13
+ class RequirementParser:
14
+ """
15
+ A utility class for parsing requirements files using pip's internal parser.
16
+ """
17
+
18
+ def parse(self, requirements: list[str] | str | None = None) -> list[str] | None:
19
+ """
20
+ Parse the requirements file.
21
+
22
+ Returns
23
+ -------
24
+ list[str] | None
25
+ A list of requirement strings or None if no requirements are provided.
26
+ """
27
+ if requirements is None:
28
+ return
29
+ elif isinstance(requirements, str):
30
+ self._validate_path(requirements)
31
+ parser = RequirementParserFactory().get_parser(requirements)
32
+ parsed = parser.parse_requirements(requirements)
33
+ return self.read_installed_packages(parsed)
34
+ return self.read_installed_packages(requirements)
35
+
36
+ def _validate_path(self, path: str) -> None:
37
+ """
38
+ Validate the provided path.
39
+ """
40
+ if not Path(path).exists():
41
+ raise FileNotFoundError(f"Requirements file not found: {path}")
42
+ if not Path(path).is_file():
43
+ raise ValueError(f"Provided path is not a file: {path}")
44
+
45
+ @staticmethod
46
+ def read_installed_packages(requirements: list[str] | None = None) -> list[str] | None:
47
+ """
48
+ Read installed packages in execution context.
49
+
50
+ If requirements is provided, returns only those packages with their
51
+ versions filled in from the environment. Package names without versions
52
+ in the requirements list will have their versions added if found.
53
+
54
+ Parameters
55
+ ----------
56
+ requirements : list[str]
57
+ Optional list of package names (e.g., ['pandas', 'torch']) or
58
+ requirements with versions (e.g., ['pandas==2.0.0']).
59
+
60
+ Returns
61
+ -------
62
+ list[str]
63
+ List of installed packages in pip freeze format (e.g., ['numpy==1.24.0', 'pandas==2.0.0']).
64
+ """
65
+ separators = ["==", ">=", "<=", ">", "<", "~=", "!="]
66
+
67
+ # Build a mapping of normalized package names to their installed versions
68
+ installed_map: dict[str, str] = {}
69
+ for pkg in freeze.freeze():
70
+ # Handle different separators
71
+ for sep in separators:
72
+ if sep in pkg:
73
+ name, version = pkg.split(sep, 1)
74
+ # Normalize package name (lowercase, replace _ with -)
75
+ installed_map[name.lower().replace("_", "-")] = f"{name}{sep}{version}"
76
+ break
77
+
78
+ result = []
79
+ for req in requirements:
80
+ # Check if requirement already has a version specifier
81
+ has_version = any(sep in req for sep in separators)
82
+
83
+ if has_version:
84
+ # Keep as-is if version is already specified
85
+ result.append(req)
86
+ else:
87
+ # Normalize the requirement name for lookup
88
+ normalized_name = req.lower().replace("_", "-")
89
+ if normalized_name in installed_map:
90
+ # Use the installed version
91
+ result.append(installed_map[normalized_name])
92
+ else:
93
+ # Package not found in environment, keep without version
94
+ result.append(req)
95
+
96
+ return result