arkitekt-next 0.8.12__tar.gz → 0.8.14__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.
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.14}/PKG-INFO +8 -8
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.14}/arkitekt_next/base_models.py +19 -11
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.14}/arkitekt_next/cli/commands/inspect/requirements.py +4 -4
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.14}/arkitekt_next/cli/commands/kabinet/build.py +4 -4
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.14}/arkitekt_next/cli/commands/kabinet/publish.py +2 -2
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.14}/arkitekt_next/cli/io.py +16 -14
- arkitekt_next-0.8.14/arkitekt_next/cli/types.py +182 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.14}/arkitekt_next/service_registry.py +4 -5
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.14}/pyproject.toml +8 -8
- arkitekt_next-0.8.12/arkitekt_next/cli/types.py +0 -365
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.14}/LICENSE +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.14}/README.md +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.14}/arkitekt_next/__blok__.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.14}/arkitekt_next/__init__.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.14}/arkitekt_next/apps/__init__.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.14}/arkitekt_next/apps/service/__init__.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.14}/arkitekt_next/apps/service/fakts_next.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.14}/arkitekt_next/apps/service/fakts_qt.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.14}/arkitekt_next/apps/service/grant_registry.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.14}/arkitekt_next/apps/service/herre.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.14}/arkitekt_next/apps/service/herre_qt.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.14}/arkitekt_next/apps/types.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.14}/arkitekt_next/bloks/__init__.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.14}/arkitekt_next/bloks/admin.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.14}/arkitekt_next/bloks/arkitekt.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.14}/arkitekt_next/bloks/base.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.14}/arkitekt_next/bloks/config.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.14}/arkitekt_next/bloks/fluss.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.14}/arkitekt_next/bloks/gateway.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.14}/arkitekt_next/bloks/internal_docker.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.14}/arkitekt_next/bloks/kabinet.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.14}/arkitekt_next/bloks/livekit.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.14}/arkitekt_next/bloks/lok.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.14}/arkitekt_next/bloks/mikro.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.14}/arkitekt_next/bloks/minio.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.14}/arkitekt_next/bloks/mount.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.14}/arkitekt_next/bloks/namegen.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.14}/arkitekt_next/bloks/orkestrator.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.14}/arkitekt_next/bloks/postgres.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.14}/arkitekt_next/bloks/redis.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.14}/arkitekt_next/bloks/rekuest.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.14}/arkitekt_next/bloks/secret.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.14}/arkitekt_next/bloks/services/__init__.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.14}/arkitekt_next/bloks/services/admin.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.14}/arkitekt_next/bloks/services/config.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.14}/arkitekt_next/bloks/services/db.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.14}/arkitekt_next/bloks/services/gateway.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.14}/arkitekt_next/bloks/services/livekit.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.14}/arkitekt_next/bloks/services/lok.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.14}/arkitekt_next/bloks/services/mount.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.14}/arkitekt_next/bloks/services/name.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.14}/arkitekt_next/bloks/services/redis.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.14}/arkitekt_next/bloks/services/s3.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.14}/arkitekt_next/bloks/services/secret.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.14}/arkitekt_next/bloks/services/socket.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.14}/arkitekt_next/bloks/socket.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.14}/arkitekt_next/bloks/tailscale.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.14}/arkitekt_next/builders.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.14}/arkitekt_next/cli/__init__.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.14}/arkitekt_next/cli/commands/call/__init__.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.14}/arkitekt_next/cli/commands/call/local.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.14}/arkitekt_next/cli/commands/call/main.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.14}/arkitekt_next/cli/commands/call/remote.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.14}/arkitekt_next/cli/commands/gen/__init__.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.14}/arkitekt_next/cli/commands/gen/compile.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.14}/arkitekt_next/cli/commands/gen/init.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.14}/arkitekt_next/cli/commands/gen/main.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.14}/arkitekt_next/cli/commands/gen/watch.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.14}/arkitekt_next/cli/commands/init/__init__.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.14}/arkitekt_next/cli/commands/init/main.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.14}/arkitekt_next/cli/commands/inspect/__init__.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.14}/arkitekt_next/cli/commands/inspect/main.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.14}/arkitekt_next/cli/commands/inspect/templates.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.14}/arkitekt_next/cli/commands/inspect/variables.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.14}/arkitekt_next/cli/commands/kabinet/__init__.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.14}/arkitekt_next/cli/commands/kabinet/init.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.14}/arkitekt_next/cli/commands/kabinet/main.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.14}/arkitekt_next/cli/commands/kabinet/stage.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.14}/arkitekt_next/cli/commands/kabinet/utils.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.14}/arkitekt_next/cli/commands/kabinet/validate.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.14}/arkitekt_next/cli/commands/kabinet/wizard.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.14}/arkitekt_next/cli/commands/manifest/__init__.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.14}/arkitekt_next/cli/commands/manifest/inspect.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.14}/arkitekt_next/cli/commands/manifest/main.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.14}/arkitekt_next/cli/commands/manifest/scopes.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.14}/arkitekt_next/cli/commands/manifest/version.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.14}/arkitekt_next/cli/commands/manifest/wizard.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.14}/arkitekt_next/cli/commands/run/__init__.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.14}/arkitekt_next/cli/commands/run/dev.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.14}/arkitekt_next/cli/commands/run/main.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.14}/arkitekt_next/cli/commands/run/prod.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.14}/arkitekt_next/cli/commands/run/utils.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.14}/arkitekt_next/cli/configs/base.yaml +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.14}/arkitekt_next/cli/constants.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.14}/arkitekt_next/cli/dockerfiles/vanilla.dockerfile +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.14}/arkitekt_next/cli/errors.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.14}/arkitekt_next/cli/inspect.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.14}/arkitekt_next/cli/main.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.14}/arkitekt_next/cli/options.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.14}/arkitekt_next/cli/schemas/fluss.schema.graphql +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.14}/arkitekt_next/cli/schemas/gucker.schema.graphql +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.14}/arkitekt_next/cli/schemas/kabinet.schema.graphql +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.14}/arkitekt_next/cli/schemas/kluster.schema.graphql +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.14}/arkitekt_next/cli/schemas/konviktion.schema.graphql +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.14}/arkitekt_next/cli/schemas/kuay.schema.graphql +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.14}/arkitekt_next/cli/schemas/mikro.schema.graphql +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.14}/arkitekt_next/cli/schemas/mikro_next.schema.graphql +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.14}/arkitekt_next/cli/schemas/napari.schema.graphql +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.14}/arkitekt_next/cli/schemas/omero_ark.schema.graphql +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.14}/arkitekt_next/cli/schemas/port.schema.graphql +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.14}/arkitekt_next/cli/schemas/rekuest.schema.graphql +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.14}/arkitekt_next/cli/schemas/rekuest_next.schema.graphql +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.14}/arkitekt_next/cli/schemas/unlok.schema.graphql +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.14}/arkitekt_next/cli/templates/filter.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.14}/arkitekt_next/cli/templates/simple.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.14}/arkitekt_next/cli/texts.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.14}/arkitekt_next/cli/ui.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.14}/arkitekt_next/cli/utils.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.14}/arkitekt_next/cli/validators.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.14}/arkitekt_next/cli/vars.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.14}/arkitekt_next/cli/versions/v1.yaml +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.14}/arkitekt_next/constants.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.14}/arkitekt_next/qt/__init__.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.14}/arkitekt_next/qt/assets/dark/gear.png +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.14}/arkitekt_next/qt/assets/dark/green pulse.gif +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.14}/arkitekt_next/qt/assets/dark/orange pulse.gif +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.14}/arkitekt_next/qt/assets/dark/pink pulse.gif +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.14}/arkitekt_next/qt/assets/dark/red pulse.gif +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.14}/arkitekt_next/qt/assets/light/gear.png +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.14}/arkitekt_next/qt/assets/light/green pulse.gif +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.14}/arkitekt_next/qt/assets/light/orange pulse.gif +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.14}/arkitekt_next/qt/assets/light/pink pulse.gif +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.14}/arkitekt_next/qt/assets/light/red pulse.gif +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.14}/arkitekt_next/qt/builders.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.14}/arkitekt_next/qt/magic_bar.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.14}/arkitekt_next/qt/types.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.14}/arkitekt_next/qt/utils.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.14}/arkitekt_next/tqdm.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.14}/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.
|
|
3
|
+
Version: 0.8.14
|
|
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.
|
|
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
|
+
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.
|
|
28
|
-
Requires-Dist: mikro-next (>=0.1.
|
|
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.
|
|
32
|
-
Requires-Dist: rekuest-next (>=0.2.
|
|
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.
|
|
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() ->
|
|
19
|
-
return
|
|
20
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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[
|
|
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? """
|
{arkitekt_next-0.8.12 → arkitekt_next-0.8.14}/arkitekt_next/cli/commands/inspect/requirements.py
RENAMED
|
@@ -66,10 +66,10 @@ def requirements(
|
|
|
66
66
|
logo=manifest.logo,
|
|
67
67
|
)
|
|
68
68
|
|
|
69
|
-
x =
|
|
70
|
-
|
|
71
|
-
for
|
|
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,
|
|
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) ->
|
|
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) ->
|
|
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
|
|
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]:
|
|
@@ -23,11 +23,11 @@ def check_if_build_already_deployed(build: Build) -> None:
|
|
|
23
23
|
A click exception if the manifest has already been deployed
|
|
24
24
|
"""
|
|
25
25
|
config = get_deployments()
|
|
26
|
-
for deployment in config.
|
|
26
|
+
for deployment in config.app_images:
|
|
27
27
|
if (
|
|
28
28
|
deployment.manifest.identifier == build.manifest.identifier
|
|
29
29
|
and deployment.manifest.version == build.manifest.version
|
|
30
|
-
and deployment.
|
|
30
|
+
and deployment.flavour_name == build.flavour
|
|
31
31
|
):
|
|
32
32
|
raise click.ClickException(
|
|
33
33
|
f"Deployment of {build.manifest.identifier}/{build.manifest.version} in the {build.flavour} flavour already exists."
|
|
@@ -1,15 +1,17 @@
|
|
|
1
|
+
import datetime
|
|
2
|
+
import uuid
|
|
1
3
|
from arkitekt_next.utils import create_arkitekt_next_folder
|
|
2
4
|
import os
|
|
3
5
|
from typing import Optional, List, Dict
|
|
4
6
|
from arkitekt_next.cli.types import (
|
|
5
|
-
Inspection,
|
|
6
7
|
Manifest,
|
|
7
8
|
Build,
|
|
8
9
|
BuildsConfigFile,
|
|
9
|
-
Deployment,
|
|
10
10
|
Flavour,
|
|
11
11
|
DeploymentsConfigFile,
|
|
12
12
|
)
|
|
13
|
+
from kabinet.api.schema import InspectionInput, AppImageInput, DockerImageInput
|
|
14
|
+
|
|
13
15
|
import yaml
|
|
14
16
|
import json
|
|
15
17
|
import rich_click as click
|
|
@@ -120,7 +122,7 @@ def generate_build(
|
|
|
120
122
|
flavour_name: str,
|
|
121
123
|
flavour: Flavour,
|
|
122
124
|
manifest: Manifest,
|
|
123
|
-
inspection: Optional[
|
|
125
|
+
inspection: Optional[InspectionInput],
|
|
124
126
|
) -> Build:
|
|
125
127
|
"""Generates a build from a builder, build_id and manifest
|
|
126
128
|
|
|
@@ -201,7 +203,7 @@ def generate_deployment(
|
|
|
201
203
|
deployment_run: str,
|
|
202
204
|
build: Build,
|
|
203
205
|
image: str,
|
|
204
|
-
) ->
|
|
206
|
+
) -> AppImageInput:
|
|
205
207
|
"""Generates a deployment from a build and an image
|
|
206
208
|
|
|
207
209
|
Parameters
|
|
@@ -225,29 +227,29 @@ def generate_deployment(
|
|
|
225
227
|
|
|
226
228
|
config_file = os.path.join(path, "deployments.yaml")
|
|
227
229
|
|
|
228
|
-
|
|
229
|
-
|
|
230
|
+
app_image = AppImageInput(
|
|
231
|
+
appImageId=uuid.uuid4().hex,
|
|
230
232
|
manifest=build.manifest,
|
|
231
|
-
|
|
233
|
+
flavourName=build.flavour,
|
|
232
234
|
selectors=build.selectors,
|
|
233
235
|
inspection=build.inspection,
|
|
234
|
-
image=image,
|
|
236
|
+
image=DockerImageInput(imageString=image, buildAt=datetime.datetime.now()),
|
|
237
|
+
|
|
235
238
|
)
|
|
236
239
|
|
|
237
240
|
if os.path.exists(config_file):
|
|
238
241
|
with open(config_file, "r") as file:
|
|
239
242
|
config = DeploymentsConfigFile(**yaml.safe_load(file))
|
|
240
|
-
config.
|
|
241
|
-
config.
|
|
243
|
+
config.app_images.append(app_image)
|
|
244
|
+
config.latest_app_image = app_image.app_image_id
|
|
242
245
|
else:
|
|
243
|
-
config = DeploymentsConfigFile(
|
|
244
|
-
config.latest_deployment_run = deployment_run
|
|
246
|
+
config = DeploymentsConfigFile(app_images=[app_image], latest_app_image=app_image.app_image_id)
|
|
245
247
|
|
|
246
248
|
with open(config_file, "w") as file:
|
|
247
249
|
yaml.safe_dump(
|
|
248
|
-
json.loads(config.
|
|
250
|
+
json.loads(config.model_dump_json(exclude_none=True, by_alias=True)),
|
|
249
251
|
file,
|
|
250
252
|
sort_keys=True,
|
|
251
253
|
)
|
|
252
254
|
|
|
253
|
-
return
|
|
255
|
+
return app_image
|
|
@@ -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, ManifestInput
|
|
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: ManifestInput
|
|
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
|
-
|
|
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
|
|
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.
|
|
3
|
+
version = "0.8.14"
|
|
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.
|
|
15
|
-
kabinet = { version = ">=0.1.
|
|
16
|
-
fluss-next = { version = ">=0.1.
|
|
17
|
-
reaktion-next= { version = ">=0.1.
|
|
18
|
-
rekuest-next= { version = ">=0.2.
|
|
19
|
-
unlok-next= { version = ">=0.1.
|
|
20
|
-
lovekit = { version = ">=0.1.
|
|
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 }
|