arkitekt-next 0.8.12__tar.gz → 0.8.13__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 arkitekt-next might be problematic. Click here for more details.

Files changed (139) hide show
  1. {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/PKG-INFO +8 -8
  2. {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/base_models.py +19 -11
  3. {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/cli/commands/inspect/requirements.py +4 -4
  4. {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/cli/commands/kabinet/build.py +4 -4
  5. {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/cli/io.py +11 -10
  6. arkitekt_next-0.8.13/arkitekt_next/cli/types.py +182 -0
  7. {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/service_registry.py +4 -5
  8. {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/pyproject.toml +8 -8
  9. arkitekt_next-0.8.12/arkitekt_next/cli/types.py +0 -365
  10. {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/LICENSE +0 -0
  11. {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/README.md +0 -0
  12. {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/__blok__.py +0 -0
  13. {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/__init__.py +0 -0
  14. {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/apps/__init__.py +0 -0
  15. {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/apps/service/__init__.py +0 -0
  16. {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/apps/service/fakts_next.py +0 -0
  17. {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/apps/service/fakts_qt.py +0 -0
  18. {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/apps/service/grant_registry.py +0 -0
  19. {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/apps/service/herre.py +0 -0
  20. {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/apps/service/herre_qt.py +0 -0
  21. {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/apps/types.py +0 -0
  22. {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/bloks/__init__.py +0 -0
  23. {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/bloks/admin.py +0 -0
  24. {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/bloks/arkitekt.py +0 -0
  25. {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/bloks/base.py +0 -0
  26. {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/bloks/config.py +0 -0
  27. {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/bloks/fluss.py +0 -0
  28. {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/bloks/gateway.py +0 -0
  29. {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/bloks/internal_docker.py +0 -0
  30. {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/bloks/kabinet.py +0 -0
  31. {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/bloks/livekit.py +0 -0
  32. {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/bloks/lok.py +0 -0
  33. {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/bloks/mikro.py +0 -0
  34. {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/bloks/minio.py +0 -0
  35. {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/bloks/mount.py +0 -0
  36. {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/bloks/namegen.py +0 -0
  37. {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/bloks/orkestrator.py +0 -0
  38. {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/bloks/postgres.py +0 -0
  39. {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/bloks/redis.py +0 -0
  40. {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/bloks/rekuest.py +0 -0
  41. {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/bloks/secret.py +0 -0
  42. {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/bloks/services/__init__.py +0 -0
  43. {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/bloks/services/admin.py +0 -0
  44. {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/bloks/services/config.py +0 -0
  45. {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/bloks/services/db.py +0 -0
  46. {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/bloks/services/gateway.py +0 -0
  47. {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/bloks/services/livekit.py +0 -0
  48. {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/bloks/services/lok.py +0 -0
  49. {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/bloks/services/mount.py +0 -0
  50. {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/bloks/services/name.py +0 -0
  51. {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/bloks/services/redis.py +0 -0
  52. {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/bloks/services/s3.py +0 -0
  53. {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/bloks/services/secret.py +0 -0
  54. {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/bloks/services/socket.py +0 -0
  55. {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/bloks/socket.py +0 -0
  56. {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/bloks/tailscale.py +0 -0
  57. {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/builders.py +0 -0
  58. {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/cli/__init__.py +0 -0
  59. {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/cli/commands/call/__init__.py +0 -0
  60. {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/cli/commands/call/local.py +0 -0
  61. {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/cli/commands/call/main.py +0 -0
  62. {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/cli/commands/call/remote.py +0 -0
  63. {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/cli/commands/gen/__init__.py +0 -0
  64. {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/cli/commands/gen/compile.py +0 -0
  65. {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/cli/commands/gen/init.py +0 -0
  66. {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/cli/commands/gen/main.py +0 -0
  67. {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/cli/commands/gen/watch.py +0 -0
  68. {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/cli/commands/init/__init__.py +0 -0
  69. {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/cli/commands/init/main.py +0 -0
  70. {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/cli/commands/inspect/__init__.py +0 -0
  71. {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/cli/commands/inspect/main.py +0 -0
  72. {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/cli/commands/inspect/templates.py +0 -0
  73. {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/cli/commands/inspect/variables.py +0 -0
  74. {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/cli/commands/kabinet/__init__.py +0 -0
  75. {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/cli/commands/kabinet/init.py +0 -0
  76. {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/cli/commands/kabinet/main.py +0 -0
  77. {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/cli/commands/kabinet/publish.py +0 -0
  78. {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/cli/commands/kabinet/stage.py +0 -0
  79. {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/cli/commands/kabinet/utils.py +0 -0
  80. {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/cli/commands/kabinet/validate.py +0 -0
  81. {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/cli/commands/kabinet/wizard.py +0 -0
  82. {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/cli/commands/manifest/__init__.py +0 -0
  83. {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/cli/commands/manifest/inspect.py +0 -0
  84. {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/cli/commands/manifest/main.py +0 -0
  85. {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/cli/commands/manifest/scopes.py +0 -0
  86. {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/cli/commands/manifest/version.py +0 -0
  87. {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/cli/commands/manifest/wizard.py +0 -0
  88. {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/cli/commands/run/__init__.py +0 -0
  89. {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/cli/commands/run/dev.py +0 -0
  90. {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/cli/commands/run/main.py +0 -0
  91. {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/cli/commands/run/prod.py +0 -0
  92. {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/cli/commands/run/utils.py +0 -0
  93. {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/cli/configs/base.yaml +0 -0
  94. {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/cli/constants.py +0 -0
  95. {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/cli/dockerfiles/vanilla.dockerfile +0 -0
  96. {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/cli/errors.py +0 -0
  97. {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/cli/inspect.py +0 -0
  98. {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/cli/main.py +0 -0
  99. {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/cli/options.py +0 -0
  100. {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/cli/schemas/fluss.schema.graphql +0 -0
  101. {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/cli/schemas/gucker.schema.graphql +0 -0
  102. {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/cli/schemas/kabinet.schema.graphql +0 -0
  103. {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/cli/schemas/kluster.schema.graphql +0 -0
  104. {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/cli/schemas/konviktion.schema.graphql +0 -0
  105. {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/cli/schemas/kuay.schema.graphql +0 -0
  106. {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/cli/schemas/mikro.schema.graphql +0 -0
  107. {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/cli/schemas/mikro_next.schema.graphql +0 -0
  108. {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/cli/schemas/napari.schema.graphql +0 -0
  109. {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/cli/schemas/omero_ark.schema.graphql +0 -0
  110. {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/cli/schemas/port.schema.graphql +0 -0
  111. {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/cli/schemas/rekuest.schema.graphql +0 -0
  112. {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/cli/schemas/rekuest_next.schema.graphql +0 -0
  113. {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/cli/schemas/unlok.schema.graphql +0 -0
  114. {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/cli/templates/filter.py +0 -0
  115. {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/cli/templates/simple.py +0 -0
  116. {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/cli/texts.py +0 -0
  117. {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/cli/ui.py +0 -0
  118. {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/cli/utils.py +0 -0
  119. {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/cli/validators.py +0 -0
  120. {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/cli/vars.py +0 -0
  121. {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/cli/versions/v1.yaml +0 -0
  122. {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/constants.py +0 -0
  123. {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/qt/__init__.py +0 -0
  124. {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/qt/assets/dark/gear.png +0 -0
  125. {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/qt/assets/dark/green pulse.gif +0 -0
  126. {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/qt/assets/dark/orange pulse.gif +0 -0
  127. {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/qt/assets/dark/pink pulse.gif +0 -0
  128. {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/qt/assets/dark/red pulse.gif +0 -0
  129. {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/qt/assets/light/gear.png +0 -0
  130. {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/qt/assets/light/green pulse.gif +0 -0
  131. {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/qt/assets/light/orange pulse.gif +0 -0
  132. {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/qt/assets/light/pink pulse.gif +0 -0
  133. {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/qt/assets/light/red pulse.gif +0 -0
  134. {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/qt/builders.py +0 -0
  135. {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/qt/magic_bar.py +0 -0
  136. {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/qt/types.py +0 -0
  137. {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/qt/utils.py +0 -0
  138. {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/tqdm.py +0 -0
  139. {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: arkitekt-next
3
- Version: 0.8.12
3
+ Version: 0.8.13
4
4
  Summary: client for the arkitekt_next platform
5
5
  License: MIT
6
6
  Author: jhnnsrs
@@ -20,20 +20,20 @@ Requires-Dist: blok (>=0.0.19) ; (python_version >= "3.9" and python_version < "
20
20
  Requires-Dist: cryptography (>=40.0.8) ; (python_version >= "3.8" and python_version < "4.0") and (extra == "blok")
21
21
  Requires-Dist: dokker (>=1.0.0)
22
22
  Requires-Dist: fakts (>=1.0.0)
23
- Requires-Dist: fluss-next (>=0.1.86) ; extra == "all"
23
+ Requires-Dist: fluss-next (>=0.1.87) ; extra == "all"
24
24
  Requires-Dist: herre (>=1.0.0)
25
- Requires-Dist: kabinet (>=0.1.25) ; (python_version >= "3.9" and python_version < "4.0") and (extra == "all")
25
+ Requires-Dist: kabinet (>=0.1.26) ; (python_version >= "3.9" and python_version < "4.0") and (extra == "all")
26
26
  Requires-Dist: koil (>=1.0.0)
27
- Requires-Dist: lovekit (>=0.1.12) ; (python_version >= "3.10" and python_version < "4.0") and (extra == "all")
28
- Requires-Dist: mikro-next (>=0.1.41) ; (python_version >= "3.10" and python_version < "4.0") and (extra == "all")
27
+ Requires-Dist: lovekit (>=0.1.13) ; (python_version >= "3.10" and python_version < "4.0") and (extra == "all")
28
+ Requires-Dist: mikro-next (>=0.1.42) ; (python_version >= "3.10" and python_version < "4.0") and (extra == "all")
29
29
  Requires-Dist: namegenerator (>=1.0.6) ; (python_version >= "3.8" and python_version < "4.0") and (extra == "blok")
30
30
  Requires-Dist: netifaces (>=0.11.0) ; (python_version >= "3.8" and python_version < "4.0") and (extra == "blok")
31
- Requires-Dist: reaktion-next (>=0.1.76) ; (python_version >= "3.8" and python_version < "4.0") and (extra == "all")
32
- Requires-Dist: rekuest-next (>=0.2.34) ; (python_version >= "3.8" and python_version < "4.0") and (extra == "cli" or extra == "all")
31
+ Requires-Dist: reaktion-next (>=0.1.77) ; (python_version >= "3.8" and python_version < "4.0") and (extra == "all")
32
+ Requires-Dist: rekuest-next (>=0.2.35) ; (python_version >= "3.8" and python_version < "4.0") and (extra == "cli" or extra == "all")
33
33
  Requires-Dist: rich-click (>=1.6.1) ; extra == "cli" or extra == "all"
34
34
  Requires-Dist: semver (>=3.0.1) ; extra == "cli" or extra == "all"
35
35
  Requires-Dist: turms (>=0.6.0) ; (python_version >= "3.9" and python_version < "4.0") and (extra == "cli" or extra == "all")
36
- Requires-Dist: unlok-next (>=0.1.80) ; python_version >= "3.8" and python_version < "4.0"
36
+ Requires-Dist: unlok-next (>=0.1.81) ; python_version >= "3.8" and python_version < "4.0"
37
37
  Requires-Dist: watchfiles (>=0.18.1) ; extra == "cli" or extra == "all"
38
38
  Description-Content-Type: text/markdown
39
39
 
@@ -6,6 +6,7 @@ from typing import List, Optional
6
6
 
7
7
 
8
8
  class Requirement(BaseModel):
9
+ key: str
9
10
  service: str
10
11
  """ The service is the service that will be used to fill the key, it will be used to find the correct instance. It needs to fullfill
11
12
  the reverse domain naming scheme"""
@@ -15,41 +16,48 @@ class Requirement(BaseModel):
15
16
  """ The description is a human readable description of the requirement. Will be show to the user when asking for the requirement."""
16
17
 
17
18
 
18
- def build_default_requirements() -> dict[str, Requirement]:
19
- return {
20
- "lok": Requirement(
19
+ def build_default_requirements() -> List[Requirement]:
20
+ return [
21
+ Requirement(
22
+ key="lok",
21
23
  service="live.arkitekt_next.lok",
22
24
  description="An instance of ArkitektNext Lok to authenticate the user",
23
25
  ),
24
- "rekuest": Requirement(
26
+ Requirement(
27
+ key="rekuest",
25
28
  service="live.arkitekt_next.rekuest",
26
29
  description="An instance of ArkitektNext Rekuest to assign to nodes",
27
30
  ),
28
- "kabinet": Requirement(
31
+ Requirement(
32
+ key="kabinet",
29
33
  service="live.arkitekt_next.kabinet",
30
34
  description="An instance of ArkitektNext Kabinet to retrieve nodes from",
31
35
  ),
32
- "mikro": Requirement(
36
+ Requirement(
37
+ key="mikro",
33
38
  service="live.arkitekt_next.mikro",
34
39
  description="An instance of ArkitektNext Mikro to make requests to the user's data",
35
40
  optional=True,
36
41
  ),
37
- "fluss": Requirement(
42
+ Requirement(
43
+ key="fluss",
38
44
  service="live.arkitekt_next.fluss",
39
45
  description="An instance of ArkitektNext Fluss to make requests to the user's data",
40
46
  optional=False,
41
47
  ),
42
- "port": Requirement(
48
+ Requirement(
49
+ key="port",
43
50
  service="live.arkitekt_next.port",
44
51
  description="An instance of ArkitektNext Fluss to make requests to the user's data",
45
52
  optional=True,
46
53
  ),
47
- "datalayer": Requirement(
54
+ Requirement(
55
+ key="datalayer",
48
56
  service="live.arkitekt_next.datalayer",
49
57
  description="An instance of ArkitektNext Datalayer to make requests to the user's data",
50
58
  optional=False,
51
59
  ),
52
- }
60
+ ]
53
61
 
54
62
 
55
63
  class Manifest(BaseModel):
@@ -75,7 +83,7 @@ class Manifest(BaseModel):
75
83
  """ Scopes that this app should request from the user """
76
84
  logo: Optional[str]
77
85
  """ A URL to the logo of the app TODO: We should enforce this to be a http URL as local paths won't work """
78
- requirements: Optional[dict[str, Requirement]] = Field(
86
+ requirements: Optional[List[Requirement]] = Field(
79
87
  default_factory=build_default_requirements
80
88
  )
81
89
  """ Requirements that this app has TODO: What are the requirements? """
@@ -66,10 +66,10 @@ def requirements(
66
66
  logo=manifest.logo,
67
67
  )
68
68
 
69
- x = {
70
- key: item.model_dump(by_alias=True)
71
- for key, item in app.manifest.requirements.items()
72
- }
69
+ x = [
70
+ item.model_dump(by_alias=True)
71
+ for item in app.manifest.requirements
72
+ ]
73
73
  if machine_readable:
74
74
  print("--START_REQUIREMENTS--" + json.dumps(x) + "--END_REQUIREMENTS--")
75
75
 
@@ -6,7 +6,7 @@ import subprocess
6
6
  import uuid
7
7
  from arkitekt_next.cli.io import generate_build
8
8
  from click import Context
9
- from arkitekt_next.cli.types import Flavour, Inspection
9
+ from arkitekt_next.cli.types import Flavour, InspectionInput
10
10
  import yaml
11
11
  from typing import Dict, Optional
12
12
  import json
@@ -51,7 +51,7 @@ def build_flavour(flavour_name: str, flavour: Flavour) -> str:
51
51
  return build_id
52
52
 
53
53
 
54
- def inspect_docker_container(build_id: str) -> Inspection:
54
+ def inspect_docker_container(build_id: str) -> InspectionInput:
55
55
  try:
56
56
  # Run 'docker inspect' with the container ID or name
57
57
  result = subprocess.run(
@@ -173,12 +173,12 @@ def inspect_requirements(build_id: str) -> Dict[str, Requirement]:
173
173
  raise InspectionError(f"An error occurred: {e.stdout + e.stderr}") from e
174
174
 
175
175
 
176
- def inspect_build(build_id: str) -> Inspection:
176
+ def inspect_build(build_id: str) -> InspectionInput:
177
177
  size, size_root_fs = inspect_docker_container(build_id)
178
178
  templates = inspect_templates(build_id)
179
179
  requirements = inspect_requirements(build_id)
180
180
 
181
- return Inspection(size=size, templates=templates, requirements=requirements)
181
+ return InspectionInput(size=size, templates=templates, requirements=requirements)
182
182
 
183
183
 
184
184
  def get_flavours(ctx: Context, select: Optional[str] = None) -> Dict[str, Flavour]:
@@ -2,14 +2,14 @@ from arkitekt_next.utils import create_arkitekt_next_folder
2
2
  import os
3
3
  from typing import Optional, List, Dict
4
4
  from arkitekt_next.cli.types import (
5
- Inspection,
6
5
  Manifest,
7
6
  Build,
8
7
  BuildsConfigFile,
9
- Deployment,
10
8
  Flavour,
11
9
  DeploymentsConfigFile,
12
10
  )
11
+ from kabinet.api.schema import InspectionInput, AppImageInput
12
+
13
13
  import yaml
14
14
  import json
15
15
  import rich_click as click
@@ -120,7 +120,7 @@ def generate_build(
120
120
  flavour_name: str,
121
121
  flavour: Flavour,
122
122
  manifest: Manifest,
123
- inspection: Optional[Inspection],
123
+ inspection: Optional[InspectionInput],
124
124
  ) -> Build:
125
125
  """Generates a build from a builder, build_id and manifest
126
126
 
@@ -201,7 +201,7 @@ def generate_deployment(
201
201
  deployment_run: str,
202
202
  build: Build,
203
203
  image: str,
204
- ) -> Deployment:
204
+ ) -> AppImageInput:
205
205
  """Generates a deployment from a build and an image
206
206
 
207
207
  Parameters
@@ -225,10 +225,10 @@ def generate_deployment(
225
225
 
226
226
  config_file = os.path.join(path, "deployments.yaml")
227
227
 
228
- deployment = Deployment(
228
+ deployment = AppImageInput(
229
229
  build_id=build.build_id,
230
230
  manifest=build.manifest,
231
- flavour=build.flavour,
231
+ flavour_name=build.flavour,
232
232
  selectors=build.selectors,
233
233
  inspection=build.inspection,
234
234
  image=image,
@@ -237,15 +237,16 @@ def generate_deployment(
237
237
  if os.path.exists(config_file):
238
238
  with open(config_file, "r") as file:
239
239
  config = DeploymentsConfigFile(**yaml.safe_load(file))
240
- config.deployments.append(deployment)
241
- config.latest_deployment_run = deployment_run
240
+ config.app_images.append(deployment)
241
+ config.latest_app_image = deployment.release_id
242
242
  else:
243
243
  config = DeploymentsConfigFile(deployments=[deployment])
244
- config.latest_deployment_run = deployment_run
244
+ config.app_images = deployment_run
245
+ config.latest_app_image = deployment.release_id
245
246
 
246
247
  with open(config_file, "w") as file:
247
248
  yaml.safe_dump(
248
- json.loads(config.json(exclude_none=True, by_alias=True)),
249
+ json.loads(config.model_dump_json(exclude_none=True, by_alias=True)),
249
250
  file,
250
251
  sort_keys=True,
251
252
  )
@@ -0,0 +1,182 @@
1
+ from importlib.metadata import version
2
+ from pydantic import BaseModel, Field, field_validator
3
+ import datetime
4
+ from typing import List, Optional, Union, Literal, Dict
5
+ from enum import Enum
6
+ import semver
7
+ import uuid
8
+ from arkitekt_next.base_models import Requirement
9
+ from string import Formatter
10
+ import os
11
+
12
+ from kabinet.api.schema import AppImageInput, InspectionInput, SelectorInput
13
+ from rekuest_next.api.schema import TemplateInput
14
+
15
+ ALLOWED_BUILDER_KEYS = [
16
+ "tag",
17
+ "dockerfile",
18
+ "package_version",
19
+ ]
20
+
21
+
22
+ class Framework(str, Enum):
23
+ """Do we support other frameworks?"""
24
+
25
+ VANILLA = "vanilla"
26
+ TENSORFLOW = "tensorflow"
27
+ PYTORCH = "pytorch"
28
+
29
+
30
+ class Packager(str, Enum):
31
+ CONDA = "conda"
32
+ POETRY = "poetry"
33
+ PIP = "pip"
34
+
35
+
36
+ class Manifest(BaseModel):
37
+ identifier: str
38
+ version: str
39
+ author: str
40
+ logo: Optional[str] = None
41
+ entrypoint: str
42
+ scopes: List[str]
43
+ created_at: datetime.datetime = Field(default_factory=datetime.datetime.now)
44
+
45
+ @field_validator("version", mode="before")
46
+ def version_must_be_semver(cls, v) -> str:
47
+ """Checks that the version is a valid semver version"""
48
+ if isinstance(v, str):
49
+ try:
50
+ semver.VersionInfo.parse(v)
51
+ except ValueError:
52
+ raise ValueError("Version must be a valid semver version")
53
+ return str(v)
54
+
55
+ def to_console_string(self):
56
+ return f"📦 {self.identifier} ({self.version}) by {self.author}"
57
+
58
+ def to_builder_dict(self):
59
+ return {
60
+ "identifier": self.identifier,
61
+ "version": self.version,
62
+ "logo": self.logo,
63
+ "scopes": self.scopes,
64
+ }
65
+
66
+ class Config:
67
+ validate_assignment = True
68
+
69
+
70
+ class SelectorType(str, Enum):
71
+ RAM = "ram"
72
+ CPU = "cpu"
73
+ GPU = "gpu"
74
+ LABEL = "label"
75
+
76
+
77
+ class Flavour(BaseModel):
78
+ selectors: List[SelectorInput]
79
+ description: str = Field(default="")
80
+ dockerfile: str = Field(default="Dockerfile")
81
+ build_command: List[str] = Field(
82
+ default_factory=lambda: [
83
+ "docker",
84
+ "build",
85
+ "-t",
86
+ "{tag}",
87
+ "-f",
88
+ "{dockerfile}",
89
+ ".",
90
+ ]
91
+ )
92
+
93
+ @field_validator("build_command", mode="before")
94
+ def check_valid_template_name(cls, value):
95
+ """Checks that the build_command templates are valid"""
96
+
97
+ for v in value:
98
+ for literal_text, field_name, format_spec, conversion in Formatter().parse(v):
99
+ if field_name is not None:
100
+ assert (
101
+ field_name in ALLOWED_BUILDER_KEYS
102
+ ), f"Invalid template key {field_name}. Allowed keys are {ALLOWED_BUILDER_KEYS}"
103
+
104
+ return value
105
+
106
+ def generate_build_command(self, tag: str, relative_dir: str):
107
+ """Generates the build command for this flavour"""
108
+
109
+ dockerfile = os.path.join(relative_dir, self.dockerfile)
110
+
111
+ return [v.format(tag=tag, dockerfile=dockerfile) for v in self.build_command]
112
+
113
+ def check_relative_paths(self, flavour_folder: str):
114
+ """Checks that the paths are relative to the flavour folder"""
115
+
116
+ dockerfile_path = os.path.join(flavour_folder, self.dockerfile)
117
+
118
+ if not os.path.exists(dockerfile_path):
119
+ raise Exception(
120
+ f"Could not find Dockerfile {self.dockerfile} in flavour {flavour_folder}"
121
+ )
122
+
123
+
124
+
125
+ class DeploymentsConfigFile(BaseModel):
126
+ """The ConfigFile is a pydantic model that represents the deployments.yaml file
127
+
128
+
129
+ Parameters
130
+ ----------
131
+ BaseModel : _type_
132
+ _description_
133
+ """
134
+
135
+ app_images: List[AppImageInput] = []
136
+ latest_app_image: Optional[str] = None
137
+
138
+
139
+ class Build(BaseModel):
140
+ build_run: str
141
+ build_id: str
142
+ inspection: Optional[InspectionInput] = None
143
+ description: str = Field(default="")
144
+ selectors: List[SelectorInput] = Field(default_factory=list)
145
+ flavour: str = Field(default="vanilla")
146
+ manifest: Manifest
147
+ build_at: datetime.datetime = Field(default_factory=datetime.datetime.now)
148
+ base_docker_command: List[str] = Field(
149
+ default_factory=lambda: ["docker", "run", "-it", "--net", "host"]
150
+ )
151
+ base_arkitekt_next_command: List[str] = Field(
152
+ default_factory=lambda: ["arkitekt-next", "run", "prod", "--headless"]
153
+ )
154
+
155
+ def build_docker_command(self) -> List[str]:
156
+ """Builds the docker command for this build"""
157
+
158
+ base_command = self.base_docker_command
159
+
160
+ for selector in self.selectors:
161
+ base_command = base_command + selector.build_docker_params()
162
+
163
+ base_command = base_command + [self.build_id]
164
+
165
+ return base_command
166
+
167
+ def build_arkitekt_next_command(self, fakts_url: str):
168
+ """Builds the arkitekt_next command for this build"""
169
+
170
+ base_command = self.base_arkitekt_next_command
171
+
172
+ for selector in self.selectors:
173
+ base_command = base_command + selector.build_arkitekt_next_params()
174
+
175
+ base_command = base_command + ["--url", fakts_url]
176
+
177
+ return base_command
178
+
179
+
180
+ class BuildsConfigFile(BaseModel):
181
+ builds: List[Build] = Field(default_factory=list)
182
+ latest_build_run: Optional[str] = None
@@ -19,12 +19,11 @@ class Registration(BaseModel):
19
19
  builder: Callable[[Herre, Fakts, Params], object]
20
20
 
21
21
 
22
- basic_requirements = {
23
- "lok": Requirement(
22
+ basic_requirements = [Requirement(
23
+ key="lok",
24
24
  service="live.arkitekt.lok",
25
25
  description="An instance of ArkitektNext Lok to authenticate the user",
26
- ),
27
- }
26
+ )]
28
27
 
29
28
 
30
29
  class ServiceBuilderRegistry:
@@ -39,7 +38,7 @@ class ServiceBuilderRegistry:
39
38
  requirement: Requirement,
40
39
  ):
41
40
  self.service_builders[name] = service_builder
42
- self.requirements[name] = requirement
41
+ self.requirements.append(requirement)
43
42
 
44
43
  def get(self, name):
45
44
  return self.services.get(name)
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "arkitekt-next"
3
- version = "0.8.12"
3
+ version = "0.8.13"
4
4
  description = "client for the arkitekt_next platform"
5
5
  authors = ["jhnnsrs <jhnnsrs@gmail.com>"]
6
6
  license = "MIT"
@@ -11,13 +11,13 @@ readme = "README.md"
11
11
  python = "^3.8"
12
12
  herre = ">=1.0.0"
13
13
  fakts = ">=1.0.0"
14
- mikro-next = { version = ">=0.1.41", python = "^3.10", optional = true }
15
- kabinet = { version = ">=0.1.25", optional = true, python = "^3.9" }
16
- fluss-next = { version = ">=0.1.86", optional = true }
17
- reaktion-next= { version = ">=0.1.76", python = "^3.8", optional = true }
18
- rekuest-next= { version = ">=0.2.34", python = "^3.8", optional = true }
19
- unlok-next= { version = ">=0.1.80", python = "^3.8", optional = true }
20
- lovekit = { version = ">=0.1.12", python = "^3.10", optional = true }
14
+ mikro-next = { version = ">=0.1.42", python = "^3.10", optional = true }
15
+ kabinet = { version = ">=0.1.26", optional = true, python = "^3.9" }
16
+ fluss-next = { version = ">=0.1.87", optional = true }
17
+ reaktion-next= { version = ">=0.1.77", python = "^3.8", optional = true }
18
+ rekuest-next= { version = ">=0.2.35", python = "^3.8", optional = true }
19
+ unlok-next= { version = ">=0.1.81", python = "^3.8", optional = true }
20
+ lovekit = { version = ">=0.1.13", python = "^3.10", optional = true }
21
21
  rich-click = { version = ">=1.6.1", optional = true }
22
22
  watchfiles = { version = ">=0.18.1", optional = true }
23
23
  turms = { version = ">=0.6.0", python = "^3.9", optional = true }