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.
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/PKG-INFO +8 -8
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/base_models.py +19 -11
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/cli/commands/inspect/requirements.py +4 -4
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/cli/commands/kabinet/build.py +4 -4
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/cli/io.py +11 -10
- arkitekt_next-0.8.13/arkitekt_next/cli/types.py +182 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/service_registry.py +4 -5
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/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.13}/LICENSE +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/README.md +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/__blok__.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/__init__.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/apps/__init__.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/apps/service/__init__.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/apps/service/fakts_next.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/apps/service/fakts_qt.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/apps/service/grant_registry.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/apps/service/herre.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/apps/service/herre_qt.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/apps/types.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/bloks/__init__.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/bloks/admin.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/bloks/arkitekt.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/bloks/base.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/bloks/config.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/bloks/fluss.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/bloks/gateway.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/bloks/internal_docker.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/bloks/kabinet.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/bloks/livekit.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/bloks/lok.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/bloks/mikro.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/bloks/minio.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/bloks/mount.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/bloks/namegen.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/bloks/orkestrator.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/bloks/postgres.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/bloks/redis.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/bloks/rekuest.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/bloks/secret.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/bloks/services/__init__.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/bloks/services/admin.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/bloks/services/config.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/bloks/services/db.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/bloks/services/gateway.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/bloks/services/livekit.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/bloks/services/lok.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/bloks/services/mount.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/bloks/services/name.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/bloks/services/redis.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/bloks/services/s3.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/bloks/services/secret.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/bloks/services/socket.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/bloks/socket.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/bloks/tailscale.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/builders.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/cli/__init__.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/cli/commands/call/__init__.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/cli/commands/call/local.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/cli/commands/call/main.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/cli/commands/call/remote.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/cli/commands/gen/__init__.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/cli/commands/gen/compile.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/cli/commands/gen/init.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/cli/commands/gen/main.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/cli/commands/gen/watch.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/cli/commands/init/__init__.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/cli/commands/init/main.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/cli/commands/inspect/__init__.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/cli/commands/inspect/main.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/cli/commands/inspect/templates.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/cli/commands/inspect/variables.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/cli/commands/kabinet/__init__.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/cli/commands/kabinet/init.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/cli/commands/kabinet/main.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/cli/commands/kabinet/publish.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/cli/commands/kabinet/stage.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/cli/commands/kabinet/utils.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/cli/commands/kabinet/validate.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/cli/commands/kabinet/wizard.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/cli/commands/manifest/__init__.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/cli/commands/manifest/inspect.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/cli/commands/manifest/main.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/cli/commands/manifest/scopes.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/cli/commands/manifest/version.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/cli/commands/manifest/wizard.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/cli/commands/run/__init__.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/cli/commands/run/dev.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/cli/commands/run/main.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/cli/commands/run/prod.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/cli/commands/run/utils.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/cli/configs/base.yaml +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/cli/constants.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/cli/dockerfiles/vanilla.dockerfile +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/cli/errors.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/cli/inspect.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/cli/main.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/cli/options.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/cli/schemas/fluss.schema.graphql +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/cli/schemas/gucker.schema.graphql +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/cli/schemas/kabinet.schema.graphql +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/cli/schemas/kluster.schema.graphql +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/cli/schemas/konviktion.schema.graphql +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/cli/schemas/kuay.schema.graphql +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/cli/schemas/mikro.schema.graphql +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/cli/schemas/mikro_next.schema.graphql +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/cli/schemas/napari.schema.graphql +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/cli/schemas/omero_ark.schema.graphql +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/cli/schemas/port.schema.graphql +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/cli/schemas/rekuest.schema.graphql +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/cli/schemas/rekuest_next.schema.graphql +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/cli/schemas/unlok.schema.graphql +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/cli/templates/filter.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/cli/templates/simple.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/cli/texts.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/cli/ui.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/cli/utils.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/cli/validators.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/cli/vars.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/cli/versions/v1.yaml +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/constants.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/qt/__init__.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/qt/assets/dark/gear.png +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/qt/assets/dark/green pulse.gif +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/qt/assets/dark/orange pulse.gif +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/qt/assets/dark/pink pulse.gif +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/qt/assets/dark/red pulse.gif +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/qt/assets/light/gear.png +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/qt/assets/light/green pulse.gif +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/qt/assets/light/orange pulse.gif +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/qt/assets/light/pink pulse.gif +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/qt/assets/light/red pulse.gif +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/qt/builders.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/qt/magic_bar.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/qt/types.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/qt/utils.py +0 -0
- {arkitekt_next-0.8.12 → arkitekt_next-0.8.13}/arkitekt_next/tqdm.py +0 -0
- {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.
|
|
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.
|
|
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.13}/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]:
|
|
@@ -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[
|
|
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
|
-
) ->
|
|
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 =
|
|
228
|
+
deployment = AppImageInput(
|
|
229
229
|
build_id=build.build_id,
|
|
230
230
|
manifest=build.manifest,
|
|
231
|
-
|
|
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.
|
|
241
|
-
config.
|
|
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.
|
|
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.
|
|
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
|
-
|
|
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.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.
|
|
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 }
|