arkitekt-next 0.8.53__py3-none-any.whl → 0.8.55__py3-none-any.whl

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/__init__.py CHANGED
@@ -8,7 +8,7 @@ def missing_install(name: str, error: Exception):
8
8
 
9
9
 
10
10
  try:
11
- from rekuest_next.register import register
11
+ from rekuest_next.register import register, register_structure
12
12
  from rekuest_next.agents.hooks import background
13
13
  from rekuest_next.agents.hooks import startup
14
14
  from rekuest_next.agents.context import context
@@ -19,6 +19,7 @@ try:
19
19
  from rekuest_next.structures.model import model
20
20
  from rekuest_next.define import define
21
21
  except ImportError as e:
22
+ register_structure = missing_install("rekuest_next", e)
22
23
  register = missing_install("rekuest_next", e)
23
24
  background = missing_install("rekuest_next", e)
24
25
  startup = missing_install("rekuest_next", e)
@@ -32,11 +33,13 @@ except ImportError as e:
32
33
  from .builders import easy, interactive
33
34
  from .apps.types import App
34
35
  from fakts_next.helpers import afakt, fakt
36
+ from .init_registry import init, InitHookRegisty, get_current_init_hook_registry
37
+ from .service_registry import require, ServiceBuilderRegistry, get_current_service_registry
35
38
 
36
39
 
37
40
  __all__ = [
38
41
  "App",
39
- "register",
42
+ "require",
40
43
  "easy",
41
44
  "interactive",
42
45
  "publicqt",
@@ -49,6 +52,10 @@ __all__ = [
49
52
  "aprogress",
50
53
  "scheduler",
51
54
  "register_structure",
55
+ "requirement",
56
+ "ServiceBuilderRegistry",
57
+ "get_current_service_registry",
58
+ "register",
52
59
  "group",
53
60
  "useGuardian",
54
61
  "useInstanceID",
@@ -59,4 +66,7 @@ __all__ = [
59
66
  "background",
60
67
  "startup",
61
68
  "register_next",
69
+ "init",
70
+ "InitHookRegisty",
71
+ "get_current_init_hook_registry",
62
72
  ]
arkitekt_next/builders.py CHANGED
@@ -11,7 +11,8 @@ from arkitekt_next.apps.service.herre import build_arkitekt_next_herre_next
11
11
  from .utils import create_arkitekt_next_folder
12
12
  from .base_models import Manifest
13
13
  from .apps.types import App
14
- from .service_registry import ServiceBuilderRegistry, check_and_import_services
14
+ from .service_registry import ServiceBuilderRegistry, get_current_service_registry
15
+ from .init_registry import InitHookRegisty, get_current_init_hook_registry
15
16
  from arkitekt_next.constants import DEFAULT_ARKITEKT_URL
16
17
 
17
18
 
@@ -27,7 +28,8 @@ def easy(
27
28
  no_cache: bool = False,
28
29
  redeem_token: Optional[str] = None,
29
30
  app_kind: str = "development",
30
- registry: Optional[ServiceBuilderRegistry] = None,
31
+ service_registry: Optional[ServiceBuilderRegistry] = None,
32
+ init_hook_registry: Optional[InitHookRegisty] = None,
31
33
  **kwargs,
32
34
  ) -> App:
33
35
  """Creates a next app
@@ -96,7 +98,8 @@ def easy(
96
98
  NextApp
97
99
  A built app, that can be used to interact with the ArkitektNext server
98
100
  """
99
- registry = registry or check_and_import_services()
101
+ service_registry = service_registry or get_current_service_registry()
102
+ init_hook_registry = init_hook_registry or get_current_init_hook_registry()
100
103
 
101
104
  if identifier is None:
102
105
  identifier = __file__.split("/")[-1].replace(".py", "")
@@ -109,7 +112,7 @@ def easy(
109
112
  identifier=identifier,
110
113
  scopes=scopes if scopes else ["openid"],
111
114
  logo=logo,
112
- requirements=registry.get_requirements(),
115
+ requirements=service_registry.get_requirements(),
113
116
  )
114
117
 
115
118
  if token:
@@ -153,11 +156,13 @@ def easy(
153
156
  fakts=fakts_next,
154
157
  herre=herre_next,
155
158
  manifest=manifest,
156
- services=registry.build_service_map(
159
+ services=service_registry.build_service_map(
157
160
  fakts=fakts_next, herre=herre_next, params=params, manifest=manifest
158
161
  ),
159
162
  )
160
163
 
164
+ init_hook_registry.run_all(app)
165
+
161
166
  return app
162
167
 
163
168
 
@@ -1,3 +1,4 @@
1
+ import asyncio
1
2
  from pydantic import BaseModel
2
3
  import rich_click as click
3
4
  from importlib import import_module
@@ -9,9 +10,9 @@ import json
9
10
  import os
10
11
 
11
12
 
12
- async def run_app(app):
13
+ async def run_app_inspection(app):
13
14
  async with app:
14
- await app.rekuest.run()
15
+ return await app.services.get("rekuest").agent.adump_registry()
15
16
 
16
17
 
17
18
  @click.command("prod")
@@ -69,17 +70,15 @@ def templates(
69
70
  logo=manifest.logo,
70
71
  )
71
72
 
73
+
72
74
  rekuest = app.services.get("rekuest")
73
75
  if rekuest is None:
74
76
  console.print("No rekuest service found in app")
75
77
  return
76
78
 
77
- x = {
78
- key: item.model_dump(by_alias=True)
79
- for key, item in rekuest.agent.extensions[
80
- "default"
81
- ].definition_registry.templates.items()
82
- }
79
+ x = asyncio.run(run_app_inspection(app))
80
+
81
+
83
82
  if machine_readable:
84
83
  print("--START_TEMPLATES--" + json.dumps(x) + "--END_TEMPLATES--")
85
84
 
@@ -0,0 +1,187 @@
1
+ import contextvars
2
+ from functools import wraps
3
+ from pydantic import BaseModel, Field
4
+ from herre_next import Herre
5
+ from fakts_next import Fakts
6
+ from .base_models import Manifest, Requirement
7
+ from typing import Callable, Dict, Optional, Protocol, TypeVar, overload
8
+ import importlib
9
+ import sys
10
+ import os
11
+ import traceback
12
+ import logging
13
+ import pkgutil
14
+ from typing import runtime_checkable, TYPE_CHECKING, Any
15
+
16
+ if TYPE_CHECKING:
17
+ from arkitekt_next.apps import App
18
+ else:
19
+ App = Any
20
+
21
+ Params = Dict[str, str]
22
+
23
+
24
+ current_init_hook_registry = contextvars.ContextVar(
25
+ "current_init_hook_registry", default=None
26
+ )
27
+ GLOBAL_INIT_HOOK_REGISTRY = None
28
+
29
+
30
+ def get_default_init_hook_registry():
31
+ global GLOBAL_INIT_HOOK_REGISTRY
32
+ if GLOBAL_INIT_HOOK_REGISTRY is None:
33
+ GLOBAL_INIT_HOOK_REGISTRY = InitHookRegisty()
34
+ return GLOBAL_INIT_HOOK_REGISTRY
35
+
36
+
37
+ def get_current_init_hook_registry(allow_global=True):
38
+ return current_init_hook_registry.get(get_default_init_hook_registry())
39
+
40
+
41
+ class Registration(BaseModel):
42
+ name: str
43
+ requirement: Requirement
44
+ builder: Callable[[Herre, Fakts, Params], object]
45
+ schema_loader: Callable[[str], object]
46
+
47
+
48
+ @runtime_checkable
49
+ class ArkitektService(Protocol):
50
+
51
+ def get_service_name(self):
52
+ pass
53
+
54
+ def build_service(
55
+ self, fakts: Fakts, herre: Herre, params: Params, manifest: Manifest
56
+ ):
57
+ pass
58
+
59
+ def get_requirements(self):
60
+ pass
61
+
62
+ def get_graphql_schema(self):
63
+ pass
64
+
65
+ def get_turms_project(self):
66
+ pass
67
+
68
+
69
+ class BaseArkitektService:
70
+
71
+ def get_service_name(self):
72
+ raise NotImplementedError("get_service_name not implemented")
73
+
74
+ def build_service(
75
+ self, fakts: Fakts, herre: Herre, params: Params, manifest: Manifest
76
+ ):
77
+ raise NotImplementedError("build_service not implemented")
78
+
79
+ def get_requirements(self):
80
+ raise NotImplementedError("get_requirements not implemented")
81
+
82
+ def get_graphql_schema(self):
83
+ return None
84
+
85
+ def get_turms_project(self):
86
+ return None
87
+
88
+
89
+ basic_requirements = [
90
+ Requirement(
91
+ key="lok",
92
+ service="live.arkitekt.lok",
93
+ description="An instance of ArkitektNext Lok to authenticate the user",
94
+ )
95
+ ]
96
+
97
+
98
+ InitHook = Callable[[App], None]
99
+
100
+
101
+ class InitHookRegisty:
102
+
103
+ def __init__(self):
104
+ self.init_hooks: Dict[str, InitHook] = {}
105
+
106
+
107
+ def register(
108
+ self,
109
+ function: InitHook,
110
+ name: Optional[str] = None,
111
+ only_cli: bool = False,
112
+
113
+ ):
114
+
115
+ if name is None:
116
+ name = function.__name__
117
+
118
+
119
+ if name not in self.init_hooks:
120
+ self.init_hooks[name] = function
121
+ else:
122
+ raise ValueError(f"Service {name} already registered")
123
+
124
+ def run_all(self, app: App):
125
+ for hook in self.init_hooks.values():
126
+ hook(app)
127
+
128
+
129
+
130
+ T = TypeVar("T")
131
+
132
+
133
+
134
+
135
+ @overload
136
+ def init(
137
+ function_or_actor: T,
138
+ ) -> T: ...
139
+
140
+
141
+ @overload
142
+ def init(
143
+ function_or_actor: None = None,
144
+ ) -> Callable[[T], T]: ...
145
+
146
+
147
+ def init(
148
+ *func,
149
+ only_cli: bool = False,
150
+ init_hook_registry: InitHookRegisty = None,
151
+ ):
152
+ """Register a function as an init hook. This function will be called when the app is initialized.
153
+
154
+ """
155
+ init_hook_registry = init_hook_registry or get_current_init_hook_registry()
156
+
157
+ if len(func) > 1:
158
+ raise ValueError("You can only register one function or actor at a time.")
159
+ if len(func) == 1:
160
+ function_or_actor = func[0]
161
+
162
+ @wraps(function_or_actor)
163
+ def wrapped_function(*args, **kwargs):
164
+ return function_or_actor(*args, **kwargs)
165
+
166
+ init_hook_registry.register(wrapped_function)
167
+
168
+ wrapped_function.__is_init_hook__ = True
169
+
170
+ return wrapped_function
171
+
172
+ else:
173
+
174
+ def real_decorator(function_or_actor):
175
+ # Simple bypass for now
176
+ @wraps(function_or_actor)
177
+ def wrapped_function(*args, **kwargs):
178
+ return function_or_actor(*args, **kwargs)
179
+
180
+ init_hook_registry.register(wrapped_function, only_cli=only_cli)
181
+
182
+ wrapped_function.__is_init_hook__ = True
183
+
184
+
185
+ return wrapped_function
186
+
187
+ return real_decorator
@@ -1,8 +1,10 @@
1
+ import contextvars
2
+ from functools import wraps
1
3
  from pydantic import BaseModel, Field
2
4
  from herre_next import Herre
3
5
  from fakts_next import Fakts
4
6
  from .base_models import Manifest, Requirement
5
- from typing import Callable, Dict, Protocol
7
+ from typing import Callable, Dict, Optional, Protocol, TypeVar, overload
6
8
  import importlib
7
9
  import sys
8
10
  import os
@@ -14,6 +16,23 @@ from typing import runtime_checkable
14
16
  Params = Dict[str, str]
15
17
 
16
18
 
19
+ current_service_registry = contextvars.ContextVar(
20
+ "current_service_registry", default=None
21
+ )
22
+ GLOBAL_SERVICE_REGISTRY = None
23
+
24
+
25
+ def get_default_service_registry():
26
+ global GLOBAL_SERVICE_REGISTRY
27
+ if GLOBAL_SERVICE_REGISTRY is None:
28
+ GLOBAL_SERVICE_REGISTRY = ServiceBuilderRegistry()
29
+ return GLOBAL_SERVICE_REGISTRY
30
+
31
+
32
+ def get_current_service_registry(allow_global=True):
33
+ return current_service_registry.get(get_default_service_registry())
34
+
35
+
17
36
  class Registration(BaseModel):
18
37
  name: str
19
38
  requirement: Requirement
@@ -72,8 +91,12 @@ basic_requirements = [
72
91
 
73
92
 
74
93
  class ServiceBuilderRegistry:
75
- def __init__(self):
94
+ def __init__(self, import_services=True):
76
95
  self.service_builders: Dict[str, ArkitektService] = {}
96
+ self.additional_requirements: Dict[str, Requirement]= {}
97
+ if import_services:
98
+ check_and_import_services(self)
99
+
77
100
 
78
101
  def register(
79
102
  self,
@@ -86,6 +109,13 @@ class ServiceBuilderRegistry:
86
109
  self.service_builders[name] = service
87
110
  else:
88
111
  raise ValueError(f"Service {name} already registered")
112
+
113
+
114
+ def register_requirement(self, requirement: Requirement):
115
+ if requirement.key in self.additional_requirements:
116
+ raise ValueError(f"Requirement {requirement.key} already registered)")
117
+ self.additional_requirements[requirement.key] = requirement
118
+
89
119
 
90
120
  def get(self, name):
91
121
  return self.services.get(name)
@@ -121,6 +151,12 @@ class ServiceBuilderRegistry:
121
151
  taken_requirements.add(requirement.key)
122
152
  requirements.append(requirement)
123
153
 
154
+
155
+ for requirement in self.additional_requirements.values():
156
+ if requirement.key not in taken_requirements:
157
+ taken_requirements.add(requirement.key)
158
+ requirements.append(requirement)
159
+
124
160
  sorted_requirements = sorted(requirements, key=lambda x: x.key)
125
161
 
126
162
  return sorted_requirements
@@ -137,8 +173,7 @@ import traceback
137
173
  import logging
138
174
 
139
175
 
140
- def check_and_import_services() -> ServiceBuilderRegistry:
141
- service_builder_registry = ServiceBuilderRegistry()
176
+ def check_and_import_services(service_registry: ServiceBuilderRegistry) -> ServiceBuilderRegistry:
142
177
  processed_modules = set() # Track modules that have already been processed
143
178
 
144
179
  # Function to load and call init_extensions from __rekuest__.py
@@ -154,10 +189,10 @@ def check_and_import_services() -> ServiceBuilderRegistry:
154
189
  if hasattr(rekuest_module, "build_services"):
155
190
  for service in rekuest_module.build_services():
156
191
  try:
157
- service_builder_registry.register(service)
192
+ service_registry.register(service)
158
193
  except ValueError as e:
159
194
  print(
160
- f"Failed to register service {service}: Another service with the same name is already registered {service_builder_registry.service_builders}"
195
+ f"Failed to register service {service}: Another service with the same name is already registered {service_registry.service_builders}"
161
196
  )
162
197
  logging.info(f"Called build_services function from {module_name}")
163
198
  else:
@@ -196,4 +231,38 @@ def check_and_import_services() -> ServiceBuilderRegistry:
196
231
  )
197
232
  traceback.print_exc()
198
233
 
199
- return service_builder_registry
234
+ return service_registry
235
+
236
+
237
+ T = TypeVar("T")
238
+
239
+ @overload
240
+ def require(
241
+ key: str ,
242
+ service: str = None,
243
+ description: str = None,
244
+ ) -> Callable[[T], T]: ...
245
+
246
+
247
+ def require(
248
+ key: str,
249
+ service: str = None,
250
+ description: str = None,
251
+ service_registry: Optional[ServiceBuilderRegistry] = None,
252
+
253
+ ):
254
+ """Register a requirement with the service registry
255
+
256
+ """
257
+ service_hook_registry = service_registry or get_current_service_registry()
258
+
259
+
260
+
261
+ requirement = Requirement(
262
+ key=key,
263
+ service=service,
264
+ description=description
265
+ )
266
+ service_hook_registry.register_requirement(requirement)
267
+
268
+ return requirement
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: arkitekt-next
3
- Version: 0.8.53
3
+ Version: 0.8.55
4
4
  Summary: client for the arkitekt_next platform
5
5
  License: MIT
6
6
  Author: jhnnsrs
@@ -32,7 +32,7 @@ Requires-Dist: mikro-next (>=0.1.50) ; (python_version >= "3.10" and python_vers
32
32
  Requires-Dist: namegenerator (>=1.0.6) ; (python_version >= "3.8" and python_version < "4.0") and (extra == "blok")
33
33
  Requires-Dist: netifaces (>=0.11.0) ; (python_version >= "3.8" and python_version < "4.0") and (extra == "blok")
34
34
  Requires-Dist: reaktion-next (>=0.1.86) ; (python_version >= "3.8" and python_version < "4.0") and (extra == "all")
35
- Requires-Dist: rekuest-next (>=0.2.54) ; (python_version >= "3.8" and python_version < "4.0") and (extra == "cli" or extra == "all")
35
+ Requires-Dist: rekuest-next (>=0.2.57) ; (python_version >= "3.8" and python_version < "4.0") and (extra == "cli" or extra == "all")
36
36
  Requires-Dist: rich-click (>=1.6.1) ; extra == "cli" or extra == "all" or extra == "blok"
37
37
  Requires-Dist: semver (>=3.0.1) ; extra == "cli" or extra == "all"
38
38
  Requires-Dist: turms (>=0.8.2) ; (python_version >= "3.9" and python_version < "4.0") and (extra == "cli" or extra == "all")
@@ -1,5 +1,5 @@
1
1
  arkitekt_next/__blok__.py,sha256=Xo2cTi1yYMKzXtl3i58rgRoRb4DJ9EB_iBCVvKmYX14,1785
2
- arkitekt_next/__init__.py,sha256=hJ42LbKrxY19XwX9ltWXxhTvTZFh26vuItZd-2grSSM,1751
2
+ arkitekt_next/__init__.py,sha256=CBk_M-lSOJeaX7F4Lf5HPFWv6vx20Fvgs-kIGJGUpSk,2177
3
3
  arkitekt_next/apps/__init__.py,sha256=cx_5Y-RkJFkSQJH-hUEC_L3eW1jU2E426c4e6_csIyM,42
4
4
  arkitekt_next/apps/service/__init__.py,sha256=p4iRwiFBKRq2lfbjDBzUR_GMhPWjkjWTa01ohuKz_L4,157
5
5
  arkitekt_next/apps/service/fakts_next.py,sha256=Wy37fjsEP2yjKZPtMlLilNlkO0olFX_7P5IIr6g3jkE,2900
@@ -49,7 +49,7 @@ arkitekt_next/bloks/services/secret.py,sha256=cnZsH09gN9YRXBbmalZaFD2LcmWLlfm52m
49
49
  arkitekt_next/bloks/services/socket.py,sha256=3MbENiJrwQbFKrpWxax56F24elnSD7S-olgycfuOX7s,423
50
50
  arkitekt_next/bloks/socket.py,sha256=IW4954Hgms_oZsDIk9SgLoVGz07gW3sHi7-WuhN074Q,1067
51
51
  arkitekt_next/bloks/tailscale.py,sha256=87cJv9m7N_I3y2ZRvv5WVepRhvIZk4ftUpwa0yUdwj4,2961
52
- arkitekt_next/builders.py,sha256=rnEaE8qoRwWNwf5SMnO5JwOZsVJAVeRrMBB-eOyWe4A,7464
52
+ arkitekt_next/builders.py,sha256=OkjamGoowr33cUenu1_nBHhxwFVhqMKSFhFVwkgfIMI,7760
53
53
  arkitekt_next/cli/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
54
54
  arkitekt_next/cli/commands/call/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
55
55
  arkitekt_next/cli/commands/call/local.py,sha256=OAeC2r9ujBFclaCfKEmUpt0Mt3NAKw3sVPTDvs2w_8E,2059
@@ -68,7 +68,7 @@ arkitekt_next/cli/commands/init/main.py,sha256=1ZbZDBECZRxlcnulycdS15s-uQ5ngx4xP
68
68
  arkitekt_next/cli/commands/inspect/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
69
69
  arkitekt_next/cli/commands/inspect/main.py,sha256=Bu1vAZudkFCtjDnZAB8yQLDt-UKY9pJGhLBlEfDqtkw,626
70
70
  arkitekt_next/cli/commands/inspect/requirements.py,sha256=bLYaWddScW2_qQFCwRtCFUZNM3N-ZnS26ee9xXQAi14,1862
71
- arkitekt_next/cli/commands/inspect/templates.py,sha256=pymiXPTcpgKopt_nt-NC9hv4zxveQJQOMyndoPJ8knk,2286
71
+ arkitekt_next/cli/commands/inspect/templates.py,sha256=7iU26gTNs2KL7OvOHGMK-hEsfIsa1AXoMrvgYEfS-Z0,2219
72
72
  arkitekt_next/cli/commands/inspect/variables.py,sha256=LonDlbS2qH1v-jD6RfEhTv-mxmgeBMKqD3oO2iDJRjE,2698
73
73
  arkitekt_next/cli/commands/kabinet/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
74
74
  arkitekt_next/cli/commands/kabinet/build.py,sha256=uQh0nPBGsQNJ8iy-cQwMjpNx1c2ZRrBybbyZYg5doVc,8957
@@ -122,6 +122,7 @@ arkitekt_next/cli/validators.py,sha256=XkLrOrDzBJwcG1keTawa_NJPt3QIBhb5KjepeH4N1
122
122
  arkitekt_next/cli/vars.py,sha256=ev7cKDSPoik8hU9A_ohNpjRZX4FT1GYJaBoGLnxCKjU,982
123
123
  arkitekt_next/cli/versions/v1.yaml,sha256=rv2-F6FQbTZi_H6pSE_csdICdtKBObDdoo_asOFi43Y,12
124
124
  arkitekt_next/constants.py,sha256=sJkLlkH21REjbpiSHnXCiW0lWOwWT-2VqGvWlxjQePY,89
125
+ arkitekt_next/init_registry.py,sha256=31E7FCYKMaf54otwFoIcEmyWvwL80XEvl7OSoRbg61k,4192
125
126
  arkitekt_next/qt/__init__.py,sha256=5tCCd-FA3sMN9Lo5JRUYUM6xgs2zxyHj5YDpdWYbR0w,471
126
127
  arkitekt_next/qt/assets/dark/gear.png,sha256=nYl1JZhcpwd7s5FgG2g-1RpkK7TH_QQRqJMmK6r0BpU,6296
127
128
  arkitekt_next/qt/assets/dark/green pulse.gif,sha256=cUd2F3Qlvjb7SnsU-LjGgeLTa8KoPgu3C-LNrixIQds,105386
@@ -137,11 +138,11 @@ arkitekt_next/qt/builders.py,sha256=zQLn-mJJnfLHSDjfAJ7gfzv66cnQz_yNX9yKTEdapi4,
137
138
  arkitekt_next/qt/magic_bar.py,sha256=b3WS8vN9cwaDHzBMtiKpw2UQcZwO1dF0mCLbLffO-eo,17596
138
139
  arkitekt_next/qt/types.py,sha256=_oo3XCSvP_iMp1bdPRxOGRrmeyHnBKTQsf86q09irL4,4043
139
140
  arkitekt_next/qt/utils.py,sha256=MgBPtPmCSBkIuATov3UgREESwxAHh77lWNNxyE7Qs48,773
140
- arkitekt_next/service_registry.py,sha256=iGbTflBsL2HzCeulLUn1kRcuk_do9bdlQ881BIiE_HY,6276
141
+ arkitekt_next/service_registry.py,sha256=Enu88Ja7k0VBNMhNjibBqGxCiz6Qixfbvs4pUA-Mqp8,8094
141
142
  arkitekt_next/tqdm.py,sha256=lQcJI5Q6Py7Gy88hOCiJujjPEEGd8G2k1mOVJJ6oYe8,1531
142
143
  arkitekt_next/utils.py,sha256=4e4zEQSA7FZou8M01xV8oPBG1JvJJ0ySDP_nm3E3pMA,2390
143
- arkitekt_next-0.8.53.dist-info/LICENSE,sha256=YZ2oRjC248t-GpoEyw7J13vwKYNG6zhYMaEAix6EzF0,1089
144
- arkitekt_next-0.8.53.dist-info/METADATA,sha256=KZZPMgPvtoCLZUwyoY-wc4QMuxoWwvFoWCAY6txNWao,6256
145
- arkitekt_next-0.8.53.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
146
- arkitekt_next-0.8.53.dist-info/entry_points.txt,sha256=-hxikQx4xZ6TiOnWVDOlTN_kcAISgGFvTHXIchsCHSc,60
147
- arkitekt_next-0.8.53.dist-info/RECORD,,
144
+ arkitekt_next-0.8.55.dist-info/LICENSE,sha256=YZ2oRjC248t-GpoEyw7J13vwKYNG6zhYMaEAix6EzF0,1089
145
+ arkitekt_next-0.8.55.dist-info/METADATA,sha256=Yz4OLxCO364eZHFbyS5otWnao7KSEnKIXbPAFFY8UAo,6256
146
+ arkitekt_next-0.8.55.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
147
+ arkitekt_next-0.8.55.dist-info/entry_points.txt,sha256=-hxikQx4xZ6TiOnWVDOlTN_kcAISgGFvTHXIchsCHSc,60
148
+ arkitekt_next-0.8.55.dist-info/RECORD,,