crossplane-function-pythonic 0.0.7b0__tar.gz → 0.0.8__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 (195) hide show
  1. {crossplane_function_pythonic-0.0.7b0 → crossplane_function_pythonic-0.0.8}/.gitignore +2 -1
  2. {crossplane_function_pythonic-0.0.7b0 → crossplane_function_pythonic-0.0.8}/PKG-INFO +116 -26
  3. {crossplane_function_pythonic-0.0.7b0 → crossplane_function_pythonic-0.0.8}/README.md +115 -25
  4. {crossplane_function_pythonic-0.0.7b0 → crossplane_function_pythonic-0.0.8}/crossplane/pythonic/main.py +11 -10
  5. {crossplane_function_pythonic-0.0.7b0 → crossplane_function_pythonic-0.0.8}/crossplane/pythonic/packages.py +4 -5
  6. {crossplane_function_pythonic-0.0.7b0 → crossplane_function_pythonic-0.0.8}/pyproject.toml +6 -0
  7. crossplane_function_pythonic-0.0.7b0/.coveragerc +0 -2
  8. crossplane_function_pythonic-0.0.7b0/.devcontainer/devcontainer.json +0 -17
  9. crossplane_function_pythonic-0.0.7b0/.github/workflows/ci.yaml +0 -269
  10. crossplane_function_pythonic-0.0.7b0/.venv-default/.gitignore +0 -2
  11. crossplane_function_pythonic-0.0.7b0/.venv-default/CACHEDIR.TAG +0 -4
  12. crossplane_function_pythonic-0.0.7b0/.venv-default/bin/activate +0 -87
  13. crossplane_function_pythonic-0.0.7b0/.venv-default/bin/activate.csh +0 -55
  14. crossplane_function_pythonic-0.0.7b0/.venv-default/bin/activate.fish +0 -103
  15. crossplane_function_pythonic-0.0.7b0/.venv-default/bin/activate.nu +0 -96
  16. crossplane_function_pythonic-0.0.7b0/.venv-default/bin/activate.ps1 +0 -61
  17. crossplane_function_pythonic-0.0.7b0/.venv-default/bin/activate_this.py +0 -38
  18. crossplane_function_pythonic-0.0.7b0/.venv-default/bin/ipython +0 -8
  19. crossplane_function_pythonic-0.0.7b0/.venv-default/bin/ipython3 +0 -8
  20. crossplane_function_pythonic-0.0.7b0/.venv-default/bin/kopf +0 -8
  21. crossplane_function_pythonic-0.0.7b0/.venv-default/bin/pip +0 -8
  22. crossplane_function_pythonic-0.0.7b0/.venv-default/bin/pip-3.13 +0 -8
  23. crossplane_function_pythonic-0.0.7b0/.venv-default/bin/pip3 +0 -8
  24. crossplane_function_pythonic-0.0.7b0/.venv-default/bin/pip3.13 +0 -8
  25. crossplane_function_pythonic-0.0.7b0/.venv-default/bin/pygmentize +0 -8
  26. crossplane_function_pythonic-0.0.7b0/.venv-default/bin/python +0 -1
  27. crossplane_function_pythonic-0.0.7b0/.venv-default/bin/python3 +0 -1
  28. crossplane_function_pythonic-0.0.7b0/.venv-default/bin/python3.13 +0 -1
  29. crossplane_function_pythonic-0.0.7b0/.venv-default/pyvenv.cfg +0 -8
  30. crossplane_function_pythonic-0.0.7b0/.venv-default/share/man/man1/ipython.1 +0 -60
  31. crossplane_function_pythonic-0.0.7b0/.venv-test/.gitignore +0 -2
  32. crossplane_function_pythonic-0.0.7b0/.venv-test/CACHEDIR.TAG +0 -4
  33. crossplane_function_pythonic-0.0.7b0/.venv-test/bin/activate +0 -87
  34. crossplane_function_pythonic-0.0.7b0/.venv-test/bin/activate.csh +0 -55
  35. crossplane_function_pythonic-0.0.7b0/.venv-test/bin/activate.fish +0 -103
  36. crossplane_function_pythonic-0.0.7b0/.venv-test/bin/activate.nu +0 -96
  37. crossplane_function_pythonic-0.0.7b0/.venv-test/bin/activate.ps1 +0 -61
  38. crossplane_function_pythonic-0.0.7b0/.venv-test/bin/activate_this.py +0 -38
  39. crossplane_function_pythonic-0.0.7b0/.venv-test/bin/coverage +0 -8
  40. crossplane_function_pythonic-0.0.7b0/.venv-test/bin/coverage-3.13 +0 -8
  41. crossplane_function_pythonic-0.0.7b0/.venv-test/bin/coverage3 +0 -8
  42. crossplane_function_pythonic-0.0.7b0/.venv-test/bin/kopf +0 -8
  43. crossplane_function_pythonic-0.0.7b0/.venv-test/bin/pip +0 -8
  44. crossplane_function_pythonic-0.0.7b0/.venv-test/bin/pip-3.13 +0 -8
  45. crossplane_function_pythonic-0.0.7b0/.venv-test/bin/pip3 +0 -8
  46. crossplane_function_pythonic-0.0.7b0/.venv-test/bin/pip3.13 +0 -8
  47. crossplane_function_pythonic-0.0.7b0/.venv-test/bin/py.test +0 -8
  48. crossplane_function_pythonic-0.0.7b0/.venv-test/bin/pygmentize +0 -8
  49. crossplane_function_pythonic-0.0.7b0/.venv-test/bin/pytest +0 -8
  50. crossplane_function_pythonic-0.0.7b0/.venv-test/bin/python +0 -1
  51. crossplane_function_pythonic-0.0.7b0/.venv-test/bin/python3 +0 -1
  52. crossplane_function_pythonic-0.0.7b0/.venv-test/bin/python3.13 +0 -1
  53. crossplane_function_pythonic-0.0.7b0/.venv-test/pyvenv.cfg +0 -8
  54. crossplane_function_pythonic-0.0.7b0/Dockerfile +0 -15
  55. crossplane_function_pythonic-0.0.7b0/examples/alert.tgz +0 -0
  56. crossplane_function_pythonic-0.0.7b0/examples/argo.tgz +0 -0
  57. crossplane_function_pythonic-0.0.7b0/examples/argocd-application/composition.yaml +0 -87
  58. crossplane_function_pythonic-0.0.7b0/examples/argocd-application/extra.yaml +0 -53
  59. crossplane_function_pythonic-0.0.7b0/examples/argocd-application/functions.yaml +0 -13
  60. crossplane_function_pythonic-0.0.7b0/examples/argocd-application/render.sh +0 -3
  61. crossplane_function_pythonic-0.0.7b0/examples/argocd-application/xr.yaml +0 -6
  62. crossplane_function_pythonic-0.0.7b0/examples/argocd-application/xrd.yaml +0 -34
  63. crossplane_function_pythonic-0.0.7b0/examples/argocd.tgz +0 -0
  64. crossplane_function_pythonic-0.0.7b0/examples/ds-mod/composition.yaml +0 -36
  65. crossplane_function_pythonic-0.0.7b0/examples/ds-mod/daemonset.yaml +0 -35
  66. crossplane_function_pythonic-0.0.7b0/examples/ds-mod/functions.yaml +0 -9
  67. crossplane_function_pythonic-0.0.7b0/examples/ds-mod/render.sh +0 -3
  68. crossplane_function_pythonic-0.0.7b0/examples/ds-mod/xr.yaml +0 -8
  69. crossplane_function_pythonic-0.0.7b0/examples/ds-mod/xrd.yaml +0 -25
  70. crossplane_function_pythonic-0.0.7b0/examples/function-go-templating/functions.yaml +0 -15
  71. crossplane_function_pythonic-0.0.7b0/examples/grafana/EFCObservability.yaml +0 -1033
  72. crossplane_function_pythonic-0.0.7b0/examples/grafana/README.md +0 -6
  73. crossplane_function_pythonic-0.0.7b0/examples/grafana/alert.py +0 -104
  74. crossplane_function_pythonic-0.0.7b0/examples/grafana/composition.yaml +0 -30
  75. crossplane_function_pythonic-0.0.7b0/examples/grafana/configmap.yaml +0 -750
  76. crossplane_function_pythonic-0.0.7b0/examples/grafana/dashboard.json +0 -637
  77. crossplane_function_pythonic-0.0.7b0/examples/grafana/extra.yaml +0 -89
  78. crossplane_function_pythonic-0.0.7b0/examples/grafana/functions.yaml +0 -15
  79. crossplane_function_pythonic-0.0.7b0/examples/grafana/observed.yaml +0 -15
  80. crossplane_function_pythonic-0.0.7b0/examples/grafana/render.sh +0 -3
  81. crossplane_function_pythonic-0.0.7b0/examples/grafana/run-pythonic.sh +0 -3
  82. crossplane_function_pythonic-0.0.7b0/examples/grafana/secret.yaml +0 -9
  83. crossplane_function_pythonic-0.0.7b0/examples/grafana/xr.yaml +0 -26
  84. crossplane_function_pythonic-0.0.7b0/package/composite-composition.yaml +0 -18
  85. crossplane_function_pythonic-0.0.7b0/package/composite-definition.yaml +0 -32
  86. crossplane_function_pythonic-0.0.7b0/package/crossplane.yaml +0 -5
  87. crossplane_function_pythonic-0.0.7b0/package/input-definition.yaml +0 -38
  88. crossplane_function_pythonic-0.0.7b0/renovate.json +0 -6
  89. crossplane_function_pythonic-0.0.7b0/scripts/run_function.proto +0 -370
  90. crossplane_function_pythonic-0.0.7b0/scripts/setup-local.sh +0 -205
  91. crossplane_function_pythonic-0.0.7b0/tests/fn_cases/buckets.yaml +0 -37
  92. crossplane_function_pythonic-0.0.7b0/tests/fn_cases/clazz.py +0 -5
  93. crossplane_function_pythonic-0.0.7b0/tests/fn_cases/clazz.yaml +0 -14
  94. crossplane_function_pythonic-0.0.7b0/tests/fn_cases/composed.yaml +0 -57
  95. crossplane_function_pythonic-0.0.7b0/tests/fn_cases/conditions.yaml +0 -85
  96. crossplane_function_pythonic-0.0.7b0/tests/fn_cases/context.yaml +0 -46
  97. crossplane_function_pythonic-0.0.7b0/tests/fn_cases/do-nothing.yaml +0 -6
  98. crossplane_function_pythonic-0.0.7b0/tests/fn_cases/extra-resources.yaml +0 -74
  99. crossplane_function_pythonic-0.0.7b0/tests/fn_cases/get-started-app.yaml +0 -98
  100. crossplane_function_pythonic-0.0.7b0/tests/fn_cases/inline.yaml +0 -82
  101. crossplane_function_pythonic-0.0.7b0/tests/fn_cases/unknowns-fatal.yaml +0 -72
  102. crossplane_function_pythonic-0.0.7b0/tests/fn_cases/unknowns-info.yaml +0 -55
  103. crossplane_function_pythonic-0.0.7b0/tests/fn_cases/unknowns-warning.yaml +0 -73
  104. crossplane_function_pythonic-0.0.7b0/tests/fn_cases/yaml.yaml +0 -36
  105. crossplane_function_pythonic-0.0.7b0/tests/test_fn.py +0 -75
  106. crossplane_function_pythonic-0.0.7b0/tests/test_protobuf_values.py +0 -210
  107. crossplane_function_pythonic-0.0.7b0/tests/utils.py +0 -253
  108. {crossplane_function_pythonic-0.0.7b0 → crossplane_function_pythonic-0.0.8}/LICENSE +0 -0
  109. {crossplane_function_pythonic-0.0.7b0 → crossplane_function_pythonic-0.0.8}/crossplane/pythonic/__init__.py +0 -0
  110. {crossplane_function_pythonic-0.0.7b0 → crossplane_function_pythonic-0.0.8}/crossplane/pythonic/composite.py +0 -0
  111. {crossplane_function_pythonic-0.0.7b0 → crossplane_function_pythonic-0.0.8}/crossplane/pythonic/function.py +0 -0
  112. {crossplane_function_pythonic-0.0.7b0 → crossplane_function_pythonic-0.0.8}/crossplane/pythonic/protobuf.py +0 -0
  113. {crossplane_function_pythonic-0.0.7b0 → crossplane_function_pythonic-0.0.8}/examples/.dev/functions.yaml +0 -0
  114. {crossplane_function_pythonic-0.0.7b0 → crossplane_function_pythonic-0.0.8}/examples/eks-cluster/composition-v2.yaml +0 -0
  115. {crossplane_function_pythonic-0.0.7b0 → crossplane_function_pythonic-0.0.8}/examples/eks-cluster/composition.yaml +0 -0
  116. {crossplane_function_pythonic-0.0.7b0 → crossplane_function_pythonic-0.0.8}/examples/eks-cluster/definition.yaml +0 -0
  117. {crossplane_function_pythonic-0.0.7b0 → crossplane_function_pythonic-0.0.8}/examples/eks-cluster/functions.yaml +0 -0
  118. {crossplane_function_pythonic-0.0.7b0 → crossplane_function_pythonic-0.0.8}/examples/eks-cluster/render-v2.sh +0 -0
  119. {crossplane_function_pythonic-0.0.7b0 → crossplane_function_pythonic-0.0.8}/examples/eks-cluster/render.sh +0 -0
  120. {crossplane_function_pythonic-0.0.7b0 → crossplane_function_pythonic-0.0.8}/examples/eks-cluster/xr.yaml +0 -0
  121. {crossplane_function_pythonic-0.0.7b0 → crossplane_function_pythonic-0.0.8}/examples/filing-system/README.md +0 -0
  122. {crossplane_function_pythonic-0.0.7b0 → crossplane_function_pythonic-0.0.8}/examples/filing-system/composition.yaml +0 -0
  123. {crossplane_function_pythonic-0.0.7b0 → crossplane_function_pythonic-0.0.8}/examples/filing-system/definition.yaml +0 -0
  124. {crossplane_function_pythonic-0.0.7b0 → crossplane_function_pythonic-0.0.8}/examples/filing-system/function.yaml +0 -0
  125. {crossplane_function_pythonic-0.0.7b0 → crossplane_function_pythonic-0.0.8}/examples/filing-system/kustomization.yaml +0 -0
  126. {crossplane_function_pythonic-0.0.7b0 → crossplane_function_pythonic-0.0.8}/examples/filing-system/runtime.yaml +0 -0
  127. {crossplane_function_pythonic-0.0.7b0 → crossplane_function_pythonic-0.0.8}/examples/filing-system/vcluster.py +0 -0
  128. {crossplane_function_pythonic-0.0.7b0 → crossplane_function_pythonic-0.0.8}/examples/filing-system/vcluster.yaml +0 -0
  129. {crossplane_function_pythonic-0.0.7b0 → crossplane_function_pythonic-0.0.8}/examples/function-go-templating/conditions/composition.yaml +0 -0
  130. {crossplane_function_pythonic-0.0.7b0 → crossplane_function_pythonic-0.0.8}/examples/function-go-templating/conditions/functions.yaml +0 -0
  131. {crossplane_function_pythonic-0.0.7b0 → crossplane_function_pythonic-0.0.8}/examples/function-go-templating/conditions/render.sh +0 -0
  132. {crossplane_function_pythonic-0.0.7b0 → crossplane_function_pythonic-0.0.8}/examples/function-go-templating/conditions/xr.yaml +0 -0
  133. {crossplane_function_pythonic-0.0.7b0 → crossplane_function_pythonic-0.0.8}/examples/function-go-templating/conditions/xrd.yaml +0 -0
  134. {crossplane_function_pythonic-0.0.7b0 → crossplane_function_pythonic-0.0.8}/examples/function-go-templating/context/composition.yaml +0 -0
  135. {crossplane_function_pythonic-0.0.7b0 → crossplane_function_pythonic-0.0.8}/examples/function-go-templating/context/environmentConfigs.yaml +0 -0
  136. {crossplane_function_pythonic-0.0.7b0 → crossplane_function_pythonic-0.0.8}/examples/function-go-templating/context/functions.yaml +0 -0
  137. {crossplane_function_pythonic-0.0.7b0 → crossplane_function_pythonic-0.0.8}/examples/function-go-templating/context/render.sh +0 -0
  138. {crossplane_function_pythonic-0.0.7b0 → crossplane_function_pythonic-0.0.8}/examples/function-go-templating/context/xr.yaml +0 -0
  139. {crossplane_function_pythonic-0.0.7b0 → crossplane_function_pythonic-0.0.8}/examples/function-go-templating/context/xrd.yaml +0 -0
  140. {crossplane_function_pythonic-0.0.7b0 → crossplane_function_pythonic-0.0.8}/examples/function-go-templating/extra-resources/composition.yaml +0 -0
  141. {crossplane_function_pythonic-0.0.7b0 → crossplane_function_pythonic-0.0.8}/examples/function-go-templating/extra-resources/extraResources.yaml +0 -0
  142. {crossplane_function_pythonic-0.0.7b0 → crossplane_function_pythonic-0.0.8}/examples/function-go-templating/extra-resources/functions.yaml +0 -0
  143. {crossplane_function_pythonic-0.0.7b0 → crossplane_function_pythonic-0.0.8}/examples/function-go-templating/extra-resources/render.sh +0 -0
  144. {crossplane_function_pythonic-0.0.7b0 → crossplane_function_pythonic-0.0.8}/examples/function-go-templating/extra-resources/xr.yaml +0 -0
  145. {crossplane_function_pythonic-0.0.7b0 → crossplane_function_pythonic-0.0.8}/examples/function-go-templating/functions/fromYaml/composition.yaml +0 -0
  146. {crossplane_function_pythonic-0.0.7b0 → crossplane_function_pythonic-0.0.8}/examples/function-go-templating/functions/fromYaml/functions.yaml +0 -0
  147. {crossplane_function_pythonic-0.0.7b0 → crossplane_function_pythonic-0.0.8}/examples/function-go-templating/functions/fromYaml/render.sh +0 -0
  148. {crossplane_function_pythonic-0.0.7b0 → crossplane_function_pythonic-0.0.8}/examples/function-go-templating/functions/fromYaml/xr.yaml +0 -0
  149. {crossplane_function_pythonic-0.0.7b0 → crossplane_function_pythonic-0.0.8}/examples/function-go-templating/functions/getComposedResource/composition.yaml +0 -0
  150. {crossplane_function_pythonic-0.0.7b0 → crossplane_function_pythonic-0.0.8}/examples/function-go-templating/functions/getComposedResource/functions.yaml +0 -0
  151. {crossplane_function_pythonic-0.0.7b0 → crossplane_function_pythonic-0.0.8}/examples/function-go-templating/functions/getComposedResource/observed.yaml +0 -0
  152. {crossplane_function_pythonic-0.0.7b0 → crossplane_function_pythonic-0.0.8}/examples/function-go-templating/functions/getComposedResource/render.sh +0 -0
  153. {crossplane_function_pythonic-0.0.7b0 → crossplane_function_pythonic-0.0.8}/examples/function-go-templating/functions/getComposedResource/xr.yaml +0 -0
  154. {crossplane_function_pythonic-0.0.7b0 → crossplane_function_pythonic-0.0.8}/examples/function-go-templating/functions/getCompositeResource/composition.yaml +0 -0
  155. {crossplane_function_pythonic-0.0.7b0 → crossplane_function_pythonic-0.0.8}/examples/function-go-templating/functions/getCompositeResource/functions.yaml +0 -0
  156. {crossplane_function_pythonic-0.0.7b0 → crossplane_function_pythonic-0.0.8}/examples/function-go-templating/functions/getCompositeResource/render.sh +0 -0
  157. {crossplane_function_pythonic-0.0.7b0 → crossplane_function_pythonic-0.0.8}/examples/function-go-templating/functions/getCompositeResource/xr.yaml +0 -0
  158. {crossplane_function_pythonic-0.0.7b0 → crossplane_function_pythonic-0.0.8}/examples/function-go-templating/functions/getResourceCondition/composition.yaml +0 -0
  159. {crossplane_function_pythonic-0.0.7b0 → crossplane_function_pythonic-0.0.8}/examples/function-go-templating/functions/getResourceCondition/functions.yaml +0 -0
  160. {crossplane_function_pythonic-0.0.7b0 → crossplane_function_pythonic-0.0.8}/examples/function-go-templating/functions/getResourceCondition/observed.yaml +0 -0
  161. {crossplane_function_pythonic-0.0.7b0 → crossplane_function_pythonic-0.0.8}/examples/function-go-templating/functions/getResourceCondition/render.sh +0 -0
  162. {crossplane_function_pythonic-0.0.7b0 → crossplane_function_pythonic-0.0.8}/examples/function-go-templating/functions/getResourceCondition/xr.yaml +0 -0
  163. {crossplane_function_pythonic-0.0.7b0 → crossplane_function_pythonic-0.0.8}/examples/function-go-templating/functions/include/composition.yaml +0 -0
  164. {crossplane_function_pythonic-0.0.7b0 → crossplane_function_pythonic-0.0.8}/examples/function-go-templating/functions/include/functions.yaml +0 -0
  165. {crossplane_function_pythonic-0.0.7b0 → crossplane_function_pythonic-0.0.8}/examples/function-go-templating/functions/include/render.sh +0 -0
  166. {crossplane_function_pythonic-0.0.7b0 → crossplane_function_pythonic-0.0.8}/examples/function-go-templating/functions/include/xr.yaml +0 -0
  167. {crossplane_function_pythonic-0.0.7b0 → crossplane_function_pythonic-0.0.8}/examples/function-go-templating/functions/toYaml/composition.yaml +0 -0
  168. {crossplane_function_pythonic-0.0.7b0 → crossplane_function_pythonic-0.0.8}/examples/function-go-templating/functions/toYaml/functions.yaml +0 -0
  169. {crossplane_function_pythonic-0.0.7b0 → crossplane_function_pythonic-0.0.8}/examples/function-go-templating/functions/toYaml/render.sh +0 -0
  170. {crossplane_function_pythonic-0.0.7b0 → crossplane_function_pythonic-0.0.8}/examples/function-go-templating/functions/toYaml/xr.yaml +0 -0
  171. {crossplane_function_pythonic-0.0.7b0 → crossplane_function_pythonic-0.0.8}/examples/function-go-templating/inline/composition.yaml +0 -0
  172. {crossplane_function_pythonic-0.0.7b0 → crossplane_function_pythonic-0.0.8}/examples/function-go-templating/inline/functions.yaml +0 -0
  173. {crossplane_function_pythonic-0.0.7b0 → crossplane_function_pythonic-0.0.8}/examples/function-go-templating/inline/render.sh +0 -0
  174. {crossplane_function_pythonic-0.0.7b0 → crossplane_function_pythonic-0.0.8}/examples/function-go-templating/inline/xr.yaml +0 -0
  175. {crossplane_function_pythonic-0.0.7b0 → crossplane_function_pythonic-0.0.8}/examples/function-go-templating/recursive/composition-real.yaml +0 -0
  176. {crossplane_function_pythonic-0.0.7b0 → crossplane_function_pythonic-0.0.8}/examples/function-go-templating/recursive/composition-wrapper.yaml +0 -0
  177. {crossplane_function_pythonic-0.0.7b0 → crossplane_function_pythonic-0.0.8}/examples/function-go-templating/recursive/functions.yaml +0 -0
  178. {crossplane_function_pythonic-0.0.7b0 → crossplane_function_pythonic-0.0.8}/examples/function-go-templating/recursive/render.sh +0 -0
  179. {crossplane_function_pythonic-0.0.7b0 → crossplane_function_pythonic-0.0.8}/examples/function-go-templating/recursive/xr.yaml +0 -0
  180. {crossplane_function_pythonic-0.0.7b0 → crossplane_function_pythonic-0.0.8}/examples/get-started-app/composition.yaml +0 -0
  181. {crossplane_function_pythonic-0.0.7b0 → crossplane_function_pythonic-0.0.8}/examples/get-started-app/definition.yaml +0 -0
  182. {crossplane_function_pythonic-0.0.7b0 → crossplane_function_pythonic-0.0.8}/examples/get-started-app/functions.yaml +0 -0
  183. {crossplane_function_pythonic-0.0.7b0 → crossplane_function_pythonic-0.0.8}/examples/get-started-app/render.sh +0 -0
  184. {crossplane_function_pythonic-0.0.7b0 → crossplane_function_pythonic-0.0.8}/examples/get-started-app/xr.yaml +0 -0
  185. {crossplane_function_pythonic-0.0.7b0 → crossplane_function_pythonic-0.0.8}/examples/helm-copy-secret/composition.yaml +0 -0
  186. {crossplane_function_pythonic-0.0.7b0 → crossplane_function_pythonic-0.0.8}/examples/helm-copy-secret/functions.yaml +0 -0
  187. {crossplane_function_pythonic-0.0.7b0 → crossplane_function_pythonic-0.0.8}/examples/helm-copy-secret/kustomization.yaml +0 -0
  188. {crossplane_function_pythonic-0.0.7b0 → crossplane_function_pythonic-0.0.8}/examples/helm-copy-secret/render.sh +0 -0
  189. {crossplane_function_pythonic-0.0.7b0 → crossplane_function_pythonic-0.0.8}/examples/helm-copy-secret/run-function.sh +0 -0
  190. {crossplane_function_pythonic-0.0.7b0 → crossplane_function_pythonic-0.0.8}/examples/helm-copy-secret/vcluster.py +0 -0
  191. {crossplane_function_pythonic-0.0.7b0 → crossplane_function_pythonic-0.0.8}/examples/helm-copy-secret/xr.yaml +0 -0
  192. {crossplane_function_pythonic-0.0.7b0 → crossplane_function_pythonic-0.0.8}/examples/helm-copy-secret/xrd.yaml +0 -0
  193. {crossplane_function_pythonic-0.0.7b0 → crossplane_function_pythonic-0.0.8}/examples/single-purpose/functions.yaml +0 -0
  194. {crossplane_function_pythonic-0.0.7b0 → crossplane_function_pythonic-0.0.8}/examples/single-purpose/render.sh +0 -0
  195. {crossplane_function_pythonic-0.0.7b0 → crossplane_function_pythonic-0.0.8}/examples/single-purpose/xr.yaml +0 -0
@@ -211,5 +211,6 @@ marimo/_lsp/
211
211
  __marimo__/
212
212
 
213
213
  # function-pythonic
214
- pythonic-packages/
215
214
  crossplane/pythonic/__version__.py
215
+ pocs/
216
+ pythonic-packages/
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: crossplane-function-pythonic
3
- Version: 0.0.7b0
3
+ Version: 0.0.8
4
4
  Summary: A Python centric Crossplane Function
5
5
  Project-URL: Documentation, https://github.com/fortra/function-pythonic#readme
6
6
  Project-URL: Issues, https://github.com/fortra/function-pythonic/issues
@@ -80,7 +80,6 @@ metadata:
80
80
  spec:
81
81
  package: ghcr.io/fortra/function-pythonic:v0.0.7
82
82
  ```
83
-
84
83
  ## Composed Resource Dependencies
85
84
 
86
85
  function-pythonic automatically handles dependencies between composed resources.
@@ -274,34 +273,46 @@ selection. For now, use matchLabels and filter the results if required.
274
273
  RequiredResources acts like a Python list to provide access to the found required resources.
275
274
  Each resource in the list is the following RequiredResource class:
276
275
 
277
- | Field | Description |
278
- | ----- | ----------- |
279
- | RequiredResource.name | The required resource name |
280
- | RequiredResource.observed | Low level direct access to the observed required resource |
281
- | RequiredResource.apiVersion | The required resource apiVersion |
282
- | RequiredResource.kind | The required resource kind |
283
- | RequiredResource.metadata | The required resource metadata |
284
- | RequiredResource.spec | The required resource spec |
285
- | RequiredResource.data | The required resource data |
286
- | RequiredResource.status | The required resource status |
287
- | RequiredResource.conditions | The required resource conditions |
276
+ | Field | Type | Description |
277
+ | ----- | ---- | ----------- |
278
+ | RequiredResource.name | String | The required resource name |
279
+ | RequiredResource.observed | Map | Low level direct access to the observed required resource |
280
+ | RequiredResource.apiVersion | String | The required resource apiVersion |
281
+ | RequiredResource.kind | String | The required resource kind |
282
+ | RequiredResource.metadata | Map | The required resource metadata |
283
+ | RequiredResource.spec | Map | The required resource spec |
284
+ | RequiredResource.data | Map | The required resource data |
285
+ | RequiredResource.status | Map | The required resource status |
286
+ | RequiredResource.conditions | Map | The required resource conditions |
288
287
 
289
288
  ### Conditions
290
289
 
291
- The `conditions` field is a map of the resource's status conditions array, with
292
- the map key being the condition type.
290
+ The `BaseCompsite.conditions`, `Resource.conditions`, and `RequiredResource.conditions` fields
291
+ are maps of that entity's status conditions array, with the map key being the condition type.
292
+ The fields are read only for `Resource.conditions` and `RequiredResource.conditions`.
293
293
 
294
- | Field | Description |
295
- | ----- | ----------- |
296
- | Condition.type | The condtion type |
297
- | Condition.status | RequiredResource.observed | Low level direct access to the observed required resource |
298
- | RequiredResource.apiVersion | The required resource apiVersion |
299
- | RequiredResource.kind | The required resource kind |
300
- | RequiredResource.metadata | The required resource metadata |
301
- | RequiredResource.spec | The required resource spec |
302
- | RequiredResource.data | The required resource data |
303
- | RequiredResource.status | The required resource status |
304
- | RequiredResource.conditions | The required resource conditions |
294
+ | Field | Type | Description |
295
+ | ----- | ---- | ----------- |
296
+ | Condition.type | String | The condtion type, or name |
297
+ | Condition.status | Boolean | The condition status |
298
+ | Condition.reason | String | PascalCase, machine-readable reason for this condition |
299
+ | Condition.message | String | Human-readable details about the condition |
300
+ | Condition.lastTransitionTime | Timestamp | Last transition time, read only |
301
+ | Condition.claim | Boolean | Also apply the condition the claim |
302
+
303
+ ### Events
304
+
305
+ The `BaseComposite.events` field is a list of events to apply to the Composite and
306
+ optionally to the Claim.
307
+
308
+ | Field | Type | Description |
309
+ | ----- | ---- | ----------- |
310
+ | Event.info | Boolean | Normal informational event |
311
+ | Event.warning | Boolean | Warning level event |
312
+ | Event.fatal | Boolean | Fatal events also terminate composing the Composite |
313
+ | Event.reason | String | PascalCase, machine-readable reason for this event |
314
+ | Event.message | String | Human-readable details about the event |
315
+ | Event.claim | Boolean | Also apply the event to the claim |
305
316
 
306
317
  ## Single use Composites
307
318
 
@@ -322,6 +333,85 @@ spec:
322
333
  self.status.composite = 'Hello, World!'
323
334
  ```
324
335
 
336
+ ## Quick Start Development
337
+
338
+ The following example demonstrates how to locally render function-python
339
+ compositions. First, install the `crossplane-function-pythonic` python
340
+ package into the python environment:
341
+ ```shell
342
+ $ pip install crossplane-function-pythonic
343
+ ```
344
+ Next, create the following files:
345
+ #### xr.yaml
346
+ ```yaml
347
+ apiVersion: pythonic.fortra.com/v1alpha1
348
+ kind: Hello
349
+ metadata:
350
+ name: world
351
+ spec:
352
+ who: World
353
+ ```
354
+ #### composition.yaml
355
+ ```yaml
356
+ apiVersion: apiextensions.crossplane.io/v1
357
+ kind: Composition
358
+ metadata:
359
+ name: hellos.pythonic.fortra.com
360
+ spec:
361
+ compositeTypeRef:
362
+ apiVersion: pythonic.fortra.com/v1alpha1
363
+ kind: Hello
364
+ mode: Pipeline
365
+ pipeline:
366
+ - step: pythonic
367
+ functionRef:
368
+ name: function-pythonic
369
+ input:
370
+ apiVersion: pythonic.fn.fortra.com/v1alpha1
371
+ kind: Composite
372
+ composite: |
373
+ class Composite(BaseComposite):
374
+ def compose(self):
375
+ self.status.greeting = f"Hello, {self.spec.who}!"
376
+ ```
377
+ #### functions.yaml
378
+ ```yaml
379
+ apiVersion: pkg.crossplane.io/v1beta1
380
+ kind: Function
381
+ metadata:
382
+ name: function-pythonic
383
+ annotations:
384
+ render.crossplane.io/runtime: Development
385
+ spec:
386
+ package: ghcr.io/fortra/function-pythonic:v0.0.7
387
+ ```
388
+ In one terminal session, run function-pythonic:
389
+ ```shell
390
+ $ function-pythonic --insecure --debug
391
+ [2025-08-21 15:32:37.966] grpc._cython.cygrpc [DEBUG ] Using AsyncIOEngine.POLLER as I/O engine
392
+ ```
393
+ In another terminal session, render the Composite:
394
+ ```shell
395
+ $ crossplane render xr.yaml composition.yaml functions.yaml
396
+ ---
397
+ apiVersion: pythonic.fortra.com/v1alpha1
398
+ kind: Hello
399
+ metadata:
400
+ name: world
401
+ status:
402
+ conditions:
403
+ - lastTransitionTime: "2024-01-01T00:00:00Z"
404
+ reason: Available
405
+ status: "True"
406
+ type: Ready
407
+ - lastTransitionTime: "2024-01-01T00:00:00Z"
408
+ message: All resources are composed
409
+ reason: AllComposed
410
+ status: "True"
411
+ type: ResourcesComposed
412
+ greeting: Hello, World!
413
+ ```
414
+
325
415
  ## ConfigMap Packages
326
416
 
327
417
  ConfigMap based python packages are enable using the `--packages` and
@@ -59,7 +59,6 @@ metadata:
59
59
  spec:
60
60
  package: ghcr.io/fortra/function-pythonic:v0.0.7
61
61
  ```
62
-
63
62
  ## Composed Resource Dependencies
64
63
 
65
64
  function-pythonic automatically handles dependencies between composed resources.
@@ -253,34 +252,46 @@ selection. For now, use matchLabels and filter the results if required.
253
252
  RequiredResources acts like a Python list to provide access to the found required resources.
254
253
  Each resource in the list is the following RequiredResource class:
255
254
 
256
- | Field | Description |
257
- | ----- | ----------- |
258
- | RequiredResource.name | The required resource name |
259
- | RequiredResource.observed | Low level direct access to the observed required resource |
260
- | RequiredResource.apiVersion | The required resource apiVersion |
261
- | RequiredResource.kind | The required resource kind |
262
- | RequiredResource.metadata | The required resource metadata |
263
- | RequiredResource.spec | The required resource spec |
264
- | RequiredResource.data | The required resource data |
265
- | RequiredResource.status | The required resource status |
266
- | RequiredResource.conditions | The required resource conditions |
255
+ | Field | Type | Description |
256
+ | ----- | ---- | ----------- |
257
+ | RequiredResource.name | String | The required resource name |
258
+ | RequiredResource.observed | Map | Low level direct access to the observed required resource |
259
+ | RequiredResource.apiVersion | String | The required resource apiVersion |
260
+ | RequiredResource.kind | String | The required resource kind |
261
+ | RequiredResource.metadata | Map | The required resource metadata |
262
+ | RequiredResource.spec | Map | The required resource spec |
263
+ | RequiredResource.data | Map | The required resource data |
264
+ | RequiredResource.status | Map | The required resource status |
265
+ | RequiredResource.conditions | Map | The required resource conditions |
267
266
 
268
267
  ### Conditions
269
268
 
270
- The `conditions` field is a map of the resource's status conditions array, with
271
- the map key being the condition type.
269
+ The `BaseCompsite.conditions`, `Resource.conditions`, and `RequiredResource.conditions` fields
270
+ are maps of that entity's status conditions array, with the map key being the condition type.
271
+ The fields are read only for `Resource.conditions` and `RequiredResource.conditions`.
272
272
 
273
- | Field | Description |
274
- | ----- | ----------- |
275
- | Condition.type | The condtion type |
276
- | Condition.status | RequiredResource.observed | Low level direct access to the observed required resource |
277
- | RequiredResource.apiVersion | The required resource apiVersion |
278
- | RequiredResource.kind | The required resource kind |
279
- | RequiredResource.metadata | The required resource metadata |
280
- | RequiredResource.spec | The required resource spec |
281
- | RequiredResource.data | The required resource data |
282
- | RequiredResource.status | The required resource status |
283
- | RequiredResource.conditions | The required resource conditions |
273
+ | Field | Type | Description |
274
+ | ----- | ---- | ----------- |
275
+ | Condition.type | String | The condtion type, or name |
276
+ | Condition.status | Boolean | The condition status |
277
+ | Condition.reason | String | PascalCase, machine-readable reason for this condition |
278
+ | Condition.message | String | Human-readable details about the condition |
279
+ | Condition.lastTransitionTime | Timestamp | Last transition time, read only |
280
+ | Condition.claim | Boolean | Also apply the condition the claim |
281
+
282
+ ### Events
283
+
284
+ The `BaseComposite.events` field is a list of events to apply to the Composite and
285
+ optionally to the Claim.
286
+
287
+ | Field | Type | Description |
288
+ | ----- | ---- | ----------- |
289
+ | Event.info | Boolean | Normal informational event |
290
+ | Event.warning | Boolean | Warning level event |
291
+ | Event.fatal | Boolean | Fatal events also terminate composing the Composite |
292
+ | Event.reason | String | PascalCase, machine-readable reason for this event |
293
+ | Event.message | String | Human-readable details about the event |
294
+ | Event.claim | Boolean | Also apply the event to the claim |
284
295
 
285
296
  ## Single use Composites
286
297
 
@@ -301,6 +312,85 @@ spec:
301
312
  self.status.composite = 'Hello, World!'
302
313
  ```
303
314
 
315
+ ## Quick Start Development
316
+
317
+ The following example demonstrates how to locally render function-python
318
+ compositions. First, install the `crossplane-function-pythonic` python
319
+ package into the python environment:
320
+ ```shell
321
+ $ pip install crossplane-function-pythonic
322
+ ```
323
+ Next, create the following files:
324
+ #### xr.yaml
325
+ ```yaml
326
+ apiVersion: pythonic.fortra.com/v1alpha1
327
+ kind: Hello
328
+ metadata:
329
+ name: world
330
+ spec:
331
+ who: World
332
+ ```
333
+ #### composition.yaml
334
+ ```yaml
335
+ apiVersion: apiextensions.crossplane.io/v1
336
+ kind: Composition
337
+ metadata:
338
+ name: hellos.pythonic.fortra.com
339
+ spec:
340
+ compositeTypeRef:
341
+ apiVersion: pythonic.fortra.com/v1alpha1
342
+ kind: Hello
343
+ mode: Pipeline
344
+ pipeline:
345
+ - step: pythonic
346
+ functionRef:
347
+ name: function-pythonic
348
+ input:
349
+ apiVersion: pythonic.fn.fortra.com/v1alpha1
350
+ kind: Composite
351
+ composite: |
352
+ class Composite(BaseComposite):
353
+ def compose(self):
354
+ self.status.greeting = f"Hello, {self.spec.who}!"
355
+ ```
356
+ #### functions.yaml
357
+ ```yaml
358
+ apiVersion: pkg.crossplane.io/v1beta1
359
+ kind: Function
360
+ metadata:
361
+ name: function-pythonic
362
+ annotations:
363
+ render.crossplane.io/runtime: Development
364
+ spec:
365
+ package: ghcr.io/fortra/function-pythonic:v0.0.7
366
+ ```
367
+ In one terminal session, run function-pythonic:
368
+ ```shell
369
+ $ function-pythonic --insecure --debug
370
+ [2025-08-21 15:32:37.966] grpc._cython.cygrpc [DEBUG ] Using AsyncIOEngine.POLLER as I/O engine
371
+ ```
372
+ In another terminal session, render the Composite:
373
+ ```shell
374
+ $ crossplane render xr.yaml composition.yaml functions.yaml
375
+ ---
376
+ apiVersion: pythonic.fortra.com/v1alpha1
377
+ kind: Hello
378
+ metadata:
379
+ name: world
380
+ status:
381
+ conditions:
382
+ - lastTransitionTime: "2024-01-01T00:00:00Z"
383
+ reason: Available
384
+ status: "True"
385
+ type: Ready
386
+ - lastTransitionTime: "2024-01-01T00:00:00Z"
387
+ message: All resources are composed
388
+ reason: AllComposed
389
+ status: "True"
390
+ type: ResourcesComposed
391
+ greeting: Hello, World!
392
+ ```
393
+
304
394
  ## ConfigMap Packages
305
395
 
306
396
  ConfigMap based python packages are enable using the `--packages` and
@@ -19,11 +19,7 @@ from . import function
19
19
 
20
20
 
21
21
  def main():
22
- try:
23
- asyncio.run(Main().main())
24
- except:
25
- traceback.print_exc()
26
- sys.exit(1)
22
+ asyncio.run(Main().main())
27
23
 
28
24
 
29
25
  class Main:
@@ -38,6 +34,7 @@ class Main:
38
34
  '--log-name-width',
39
35
  type=int,
40
36
  default=40,
37
+ metavar='WIDTH',
41
38
  help='Width of the logger name in the log output, default 40',
42
39
  )
43
40
  parser.add_argument(
@@ -48,6 +45,7 @@ class Main:
48
45
  parser.add_argument(
49
46
  '--tls-certs-dir',
50
47
  default=os.getenv('TLS_SERVER_CERTS_DIR'),
48
+ metavar='DIRECTORY',
51
49
  help='Serve using mTLS certificates.',
52
50
  )
53
51
  parser.add_argument(
@@ -69,21 +67,25 @@ class Main:
69
67
  '--packages-namespace',
70
68
  action='append',
71
69
  default=[],
72
- help='Namespaces to discover function-pythonic ConfigMaps and Secrets in, default is cluster wide.',
70
+ metavar='NAMESPACE',
71
+ help='Namespaces to discover function-pythonic ConfigMaps in, default is cluster wide.',
73
72
  )
74
73
  parser.add_argument(
75
74
  '--packages-dir',
76
75
  default='./pythonic-packages',
77
- help='Directory to store discovered function-pythonic ConfigMaps and Secrets to, defaults "<cwd>/pythonic-packages"'
76
+ metavar='DIRECTORY',
77
+ help='Directory to store discovered function-pythonic ConfigMaps to, defaults "<cwd>/pythonic-packages"'
78
78
  )
79
79
  parser.add_argument(
80
80
  '--pip-install',
81
+ metavar='COMMAND',
81
82
  help='Pip install command to install additional Python packages.'
82
83
  )
83
84
  parser.add_argument(
84
85
  '--python-path',
85
86
  action='append',
86
87
  default=[],
88
+ metavar='DIRECTORY',
87
89
  help='Filing system directories to add to the python path',
88
90
  )
89
91
  parser.add_argument(
@@ -92,7 +94,6 @@ class Main:
92
94
  help='Allow oversized protobuf messages'
93
95
  )
94
96
  args = parser.parse_args()
95
-
96
97
  self.configure_logging(args)
97
98
 
98
99
  if args.pip_install:
@@ -136,11 +137,11 @@ class Main:
136
137
  async with asyncio.TaskGroup() as tasks:
137
138
  tasks.create_task(grpc_server.wait_for_termination())
138
139
  tasks.create_task(packages.operator(
140
+ grpc_server,
141
+ grpc_runner,
139
142
  args.packages_secrets,
140
143
  args.packages_namespace,
141
144
  args.packages_dir,
142
- grpc_server,
143
- grpc_runner,
144
145
  ))
145
146
  else:
146
147
  def stop():
@@ -8,16 +8,15 @@ import sys
8
8
  import kopf
9
9
 
10
10
 
11
- PACKAGE_LABEL = {'function-pythonic.package': kopf.PRESENT}
12
- PACKAGES_DIR = None
13
11
  GRPC_SERVER = None
14
12
  GRPC_RUNNER = None
13
+ PACKAGE_LABEL = {'function-pythonic.package': kopf.PRESENT}
14
+ PACKAGES_DIR = None
15
15
 
16
16
 
17
- def operator(packages_secrets, packages_namespace, packages_dir, grpc_server, grpc_runner):
17
+ def operator(grpc_server, grpc_runner, packages_secrets, packages_namespace, packages_dir):
18
18
  logging.getLogger('kopf.objects').setLevel(logging.INFO)
19
- global PACKAGES_DIR, GRPC_SERVER, GRPC_RUNNER
20
- PACKAGES_DIR = packages_dir
19
+ global GRPC_SERVER, GRPC_RUNNER, PACKAGES_DIR
21
20
  GRPC_SERVER = grpc_server
22
21
  GRPC_RUNNER = grpc_runner
23
22
  PACKAGES_DIR = pathlib.Path(packages_dir).expanduser().resolve()
@@ -41,6 +41,12 @@ validate-bump = false
41
41
  [tool.hatch.build.targets.wheel]
42
42
  only-include = ["crossplane"]
43
43
 
44
+ [tool.hatch.build.targets.sdist]
45
+ only-include = [
46
+ "crossplane",
47
+ "examples",
48
+ ]
49
+
44
50
  [tool.hatch.envs.default]
45
51
  type = "virtual"
46
52
  path = ".venv-default"
@@ -1,2 +0,0 @@
1
- [run]
2
- omit = tests/*
@@ -1,17 +0,0 @@
1
- {
2
- "name": "function-pythonic-devcontainer",
3
- "image": "mcr.microsoft.com/devcontainers/python:3.12-bookworm",
4
- "features": {
5
- "ghcr.io/devcontainers-extra/features/hatch:2": {},
6
- "ghcr.io/devcontainers/features/docker-in-docker:2": {
7
- "version": "latest",
8
- "enableNonRootDocker": "true",
9
- "moby": "false"
10
- },
11
- "ghcr.io/joebowbeer/devcontainers-features/crossplane:1": {
12
- "channel": "stable",
13
- "version": "current"
14
- }
15
- },
16
- "postCreateCommand": "hatch env create"
17
- }